Python django pyodbc azure回滚错误与以前的工作配置-第389行

Python django pyodbc azure回滚错误与以前的工作配置-第389行,python,sql-server,django,pyodbc,django-pyodbc-azure,Python,Sql Server,Django,Pyodbc,Django Pyodbc Azure,我在Linux上使用django pyodbc azure有一段时间了,我还使用pydobc、FreeTDS和unixODBC将django连接到SQL Server 2014。我在一个工作正常的应用程序中遇到了这个问题,调试它时遇到了麻烦。为了重现这个问题,我启动了一个全新的Django应用程序,让事情变得简单。这是我的虚拟视频: (azuretest)[vagrant@vagrant azuretest]$ pip freeze Django==1.8.6 django-pyodbc-azu

我在Linux上使用django pyodbc azure有一段时间了,我还使用pydobc、FreeTDS和unixODBC将django连接到SQL Server 2014。我在一个工作正常的应用程序中遇到了这个问题,调试它时遇到了麻烦。为了重现这个问题,我启动了一个全新的Django应用程序,让事情变得简单。这是我的虚拟视频:

(azuretest)[vagrant@vagrant azuretest]$ pip freeze
Django==1.8.6
django-pyodbc-azure==1.8.3.0
pyodbc==3.0.10
以下是连接到SQL Server的数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'myserver.com',
        'PORT': '1433',
        'NAME': 'my_db',
        'USER': 'my_db_user',
        'PASSWORD': 'mypw',
        'AUTOCOMMIT': True,
        'OPTIONS': {
            'driver': 'FreeTDS',
            'autocommit': True,
            'unicode_results': True,
            'host_is_server': True,
            'extra_params': 'tds_version=7.2',
        },
    },
}
我创建了一个简单的models.py:

class TestTemp(models.Model):
    tempdate = models.DateField()
这个设置在相当复杂的Django项目中运行良好,该项目仍然可以选择访问同一个数据库。但是,每当我尝试进行更新或迁移时,都会出现以下错误:

(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!')
显然,我们仍然在寻找一个实际的解决方案,而不是黑客和根本原因


更新2:将上面更新1中所做的更改回退到原来的django pyodbc。然后在设置中,将tds_版本更改为
7.0
7.1
。它起作用了。如果将其更改为
7.2
7.3
,它将中断。SQL Server 2008中提供的新日期字段是否会出现问题?无论哪种方式,临时解决方案都是恢复到TDS 7.1版,这显然是对修复非常有用的信息。

因为它在7.0和7.1版上工作,我想知道您的SQL Server 2014数据库是否设置为SQL Server 2000兼容级别,这将限制您使用TDS 7.1版或更低版本

链接:


django pyodbc azure的新版本已经发布,它为我解决了这个问题(谢谢你,Michaya)。要解决此问题,只需升级:

pip install django-pyodbc-azure==1.8.6

…并在必要时更新您的需求文件。此处的详细信息:

感谢您的回复-不幸的是,其兼容性级别为120,这是2014年的默认值。它以前是工作的。我不认为2014年(也许2012年)允许低于90的级别,这排除了SQL Server 7.0或2000的可能性。
pip install django-pyodbc-azure==1.8.6