回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在Linux上使用django-pyodbcazure有一段时间了,还有pydobc、FreeTDS和unixODBC将django连接到sqlserver2014。我在一个运行良好的应用程序时遇到了这个问题,调试它时遇到了困难。为了重现这个问题,我启动了一个全新的Django应用程序来简化程序。以下是我的虚拟现实:</p>
<pre><code>(azuretest)[vagrant@vagrant azuretest]$ pip freeze
Django==1.8.6
django-pyodbc-azure==1.8.3.0
pyodbc==3.0.10
</code></pre>
<p>以下是连接到SQL Server的数据库配置:</p>
^{pr2}$
<p>我创造了一个简单的模型.py公司名称:</p>
<pre><code>class TestTemp(models.Model):
tempdate = models.DateField()
</code></pre>
<p>这个设置在一个相当复杂的Django项目中运行良好,它仍然可以选择这个数据库。但是,每当我尝试进行更新或迁移时,都会遇到以下错误:</p>
<pre><code>(azuretest)[vagrant@vagrant azuretest]$ ./manage.py migrate home
Operations to perform:
Apply all migrations: home
Running migrations:
Rendering model states... DONE
Applying home.0001_initial...Traceback (most recent call last):
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/sql_server/pyodbc/base.py", line 389, in _set_aut
ocommit
self.connection.rollback()
pyodbc.Error: ('HY000', 'The driver did not supply an error!')
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in
execute_from_command_line
utility.execute()
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/core/management/__init__.py", line 346, in
execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/core/management/base.py", line 394, in run
_from_argv
self.execute(*args, **cmd_options)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/core/management/base.py", line 445, in exe
cute
output = self.handle(*args, **options)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line
222, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/migrations/executor.py", line 110, in m
igrate
self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/migrations/executor.py", line 154, in a
pply_migration
self.recorder.record_applied(migration.app_label, migration.name)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/migrations/recorder.py", line 67, in re
cord_applied
self.migration_qs.create(app=app, name=name)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/models/query.py", line 348, in create
obj.save(force_insert=True, using=self.db)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/models/base.py", line 734, in save
force_update=force_update, update_fields=update_fields)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/models/base.py", line 759, in save_base
with transaction.atomic(using=using, savepoint=False):
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/transaction.py", line 186, in __enter__
connection.set_autocommit(False)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/backends/base/base.py", line 295, in se
t_autocommit
self._set_autocommit(autocommit)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/sql_server/pyodbc/base.py", line 390, in _set_aut
ocommit
self.connection.autocommit = autocommit
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/db/utils.py", line 98, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
raise value.with_traceback(tb)
File "/home/vagrant/.virtualenvs/azuretest/lib/python3.4/site-packages/sql_server/pyodbc/base.py", line 389, in _set_aut
ocommit
self.connection.rollback()
django.db.utils.Error: ('HY000', 'The driver did not supply an error!')
</code></pre>
<p>奇怪的是,它成功地在sqlserver([home_testtemp])中创建了表,并且似乎在不必要的回滚时出错。关于进一步调试或解决问题的最佳方法有什么想法吗?当我直接对使用此用户名和密码登录的数据库运行<code>./manage.py sqlmigrate home</code>的SQL输出时,它可以正常工作。在</p>
<p>提前谢谢。在</p>
<p>更新1:这不是一个好的修复方法,但是它避免了在不应该调用回滚时出现的问题基准.py在django pyodbc azure中:</p>
<p>这很难看,而且摆脱了保护措施,但同时也能让事情正常运转。修改基准.py关于django pyodbc azure中的第389行:</p>
<pre><code>def _set_autocommit(self, autocommit):
self.connection.commit()
# with self.wrap_database_errors:
# if autocommit:
# self.connection.commit()
# else:
# self.connection.rollback()
# self.connection.autocommit = autocommit
</code></pre>
<p>显然,仍然在寻找一个实际的修复而不是黑客攻击和根本原因。在</p>
<p>更新2:将上面更新1中所做的更改恢复到原来的django-pyodbc。然后在设置中,将tds的版本更改为<code>7.0</code>或{<cd3>}。它起作用了。如果将其更改为<code>7.2</code>或<code>7.3</code>,则它将断开。从SQLServer2008开始提供的新日期字段是否有问题?不管怎样,temp解决方案都是恢复到tds7.1版本,这显然是解决问题的有用信息。在</p>