我正在尝试使用manage.py syncdb
将iis7上远程运行的sqlserver2008r2数据库与在windows7上运行python3.3的django1.6应用程序同步。但是我遇到了错误
TypeError: The first argument to execute must be a string or unicode query.
我已经安装了django pyodbc0.2.3和pyodbc3.0.7设置.pyDATABASES
作为
您可能会猜到,USER
和{Integrated_Security=Yes
和{OPTIONS
似乎必须是非空的,因为django pyodbc初始化类DatabaseWrapper
的方式,即使{
我收到的全部错误是:
Traceback (most recent call last):
File "Z:\python\ns_reports_server\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\__init__.py", line 399, in execute_from_command_line
utility.execute()
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\base.py", line 285, in execute
output = self.handle(*args, **options)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\base.py", line 415, in handle
return self.handle_noargs(**options)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\core\management\commands\syncdb.py", line 57, in handle_noargs
cursor = connection.cursor()
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\db\backends\__init__.py", line 157, in cursor
cursor = self.make_debug_cursor(self._cursor())
File "C:\Python33\lib\site-packages\django_pyodbc-0.2.3-py3.3.egg\django_pyodbc\base.py", line 290, in _cursor
File "C:\Python33\lib\site-packages\django_pyodbc-0.2.3-py3.3.egg\django_pyodbc\operations.py", line 31, in _get_sql_server_ver
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\db\backends\util.py", line 69, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Python33\lib\site-packages\django-1.6.1-py3.3.egg\django\db\backends\util.py", line 51, in execute
return self.cursor.execute(sql)
File "C:\Python33\lib\site-packages\django_pyodbc-0.2.3-py3.3.egg\django_pyodbc\base.py", line 410, in execute
TypeError: The first argument to execute must be a string or unicode query.
如果您从顶部查看第十次调用的源代码,django_pyodbc/operations.py正在查询SQL Server版本的连接
cur.execute("SELECT CAST(SERVERPROPERTY('ProductVersion') as varchar)")
然而,在调用堆栈的末尾,这个要执行的sql已经消失了。django_pyodbc/base.py有
return self.cursor.execute(sql, params)
其第一个参数未被识别为“字符串或unicode查询”。在
Python、django和sqlserver对我来说都是新的,所以答案可能很明显,但我一辈子都无法解决。干杯。在
这个问题通过添加
'driver_supports_utf8': True,'
为我们解决了按照gri在https://github.com/lionheart/django-pyodbc/issues/47上的建议工作
添加
^{pr2}$to
OPTIONS
没有修复它,但也没有破坏任何东西您也可以在配置选项中修复此问题。我为此挣扎了一段时间。尝试将您的数据库更改为1.6版的配置:
如果您在Windows上,“extra_params”将被忽略,但它使它可以移植到Linux。在
编辑:driver_supports_utf8=True,因为在其他答案中提到的将是正确的修复。在
看起来这是django pyodbc和python3的问题。在
在基准.py,第367行是
这行代码将字符串转换为字节,这是导致TypeError的原因。像你这样 在Windows上,我假设驱动程序可以处理unicode。我建议您注释掉第364到367行(format_sql函数中的前4行)。这样,您的unicode字符串将保持unicode,并且不会得到TypeError。在
https://github.com/lionheart/django-pyodbc/blob/master/django_pyodbc/base.py
^{pr2}$我对django-pyodbc提出了一个问题,它将更详细地讨论。在
https://github.com/lionheart/django-pyodbc/issues/47
相关问题 更多 >
编程相关推荐