我正在尝试修补此错误并遇到问题。django-pyodbc 是 django 的 SQL Server 后端,该错误导致任何 sql 在 python 3.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 我不知道如何编辑 egg 文件。我真的束手无策。这是我第一次涉足 python 和 django,如果我知道它会如此混乱,我绝对会坚持使用 ruby 和 rails。
非常感谢任何帮助。