我一直在 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!')
奇怪的是,它成功地在 SQL Server ([home_testtemp]) 中创建了表,并且似乎在不必要的回滚时出错。关于进一步调试或解决问题的最佳方法的任何想法?当我直接针对使用此用户名和密码登录的数据库运行 ./manage.py sqlmigrate home 的 SQL 输出时,它工作正常。
提前致谢。
更新 1:这不是一个很好的修复,但解决了在不应该调用回滚时似乎出现的问题。此更改是在 django-pyodbc-azure 中 base.py 的第 389 行附近进行的:
这很丑陋并且摆脱了保护措施,但同时可以使事情正常进行。修改 django-pyodbc-azure 中第 389 行附近的 base.py:
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
显然,仍在寻找实际的修复方法,而不是黑客攻击和根本原因。
更新 2:将上面更新 1 中所做的更改撤销到原始的 django-pyodbc。然后在设置中,将 tds_version 更改为 7.0 或 7.1。有用。如果将其更改为 7.2 或 7.3,它就会中断。这可能是 SQL Server 2008 中可用的新 DATE 字段的问题吗?无论哪种方式,一个临时解决方案是恢复到 TDS 版本 7.1,这显然是对修复有用的信息。
最佳答案
新版本的 django-pyodbc-azure 已经发布,它为我解决了这个问题(谢谢你,Michaya)。要修复它,只需升级:
pip install django-pyodbc-azure==1.8.6
...并在必要时更新您的需求文件。详情在这里:https://github.com/michiya/django-pyodbc-azure/issues/46
关于python - 先前工作配置的 django-pyodbc-azure 回滚错误 - 第 389 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33673470/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm