我正在尝试修补this bug,但遇到了问题。django-pyodbc是django的SQL Server后端,该漏洞会导致任何sql转换为python3.x中的字节类型,这会在尝试执行时引发TypeError (必须是字符串或unicode)。
以下是我在my_app/pyodbc_patch/base.py (该文件夹中唯一的文件)中的代码:
import django_pyodbc.base
class CursorWrapper(django_pyodbc.base.CursorWrapper):
def format_sql(self, sql, n_params=None):
if n_params is not None:
try:
sql = sql % tuple('?' * n_params)
except:
pass
else:
if '%s' in sql:
sql = sql.replace('%s', '?')
return sql
class DatabaseFeatures(django_pyodbc.base.DatabaseFeatures):
pass
class DatabaseWrapper(django_pyodbc.base.DatabaseWrapper):
pass我的settings.DATABASES
DATABASES = {
'default': {
'ENGINE': 'my_app.pyodbc_patch',
'HOST': '...',
'NAME': '...',
'OPTIONS': {
'host_is_server': True
}
}
}据我从django源码可以看出,django.db.utils.ConnectionHandler从DATABASES获取引擎,并让django.db.utils.load_backend导入其base模块。然而,我得到的错误与我没有应用补丁是完全一样的。这对我来说完全没有意义,因为pyodbc_patch导入了django_pyodbc本身,所以我无法想象错误版本的CursorWrapper.format_sql会被更早地调用。
另一种选择是修复我的本地django_pyodbc副本。不幸的是,我只有Python33/Lib/site-packages/django_pyodbc-0.2.3-py3.3.egg,我不知道如何编辑鸡蛋文件。我真的是束手无策。这是我第一次尝试python和django,如果我知道它会如此混乱,我绝对会坚持使用我知道的ruby和rails。
非常感谢您的帮助。
发布于 2014-05-08 20:30:36
我无法访问SQL Server2000安装,但如果我没记错的话,SQL Server2000使用UCS-2而不是UTF-8对unicode进行了编码。您还需要将TDS 7.1版与SQL Server 2000 IIRC配合使用。自从我通过FreeTDS连接到SQL Server2000已经有一段时间了,但是也许在更改django-pyodbc代码之前,可以试试这个?
'OPTIONS': {
'host_is_server': True,
'autocommit': True,
'unicode_results': True,
'extra_params': 'tds_version=7.1'
},自动提交对于Django Unicode是必需的,这将启用1.6+结果( SQL Server2000应将其转换为UCS-2 ),并设置正确的TDS版本。YMMV,但我会试一试。
https://stackoverflow.com/questions/22004042
复制相似问题