0

我正在尝试修补此错误并遇到问题。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从中获取引擎DATABASESdjango.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。

非常感谢任何帮助。

4

1 回答 1

0

我无权访问 SQL Server 2000 安装,但如果我没记错的话,SQL Server 2000 使用 UCS-2 而不是 UTF-8 编码 unicode。您还需要将 TDS 7.1 版与 SQL Server 2000、IIRC 一起使用。自从我通过 FreeTDS 连接到 SQL Server 2000 已经有一段时间了,但也许,在更改 django-pyodbc 代码之前,试试这个?

'OPTIONS': {
    'host_is_server': True,
    'autocommit': True,
    'unicode_results': True,
    'extra_params': 'tds_version=7.1'
},

Django 1.6+ 需要自动提交,这将启用 Unicode 结果(应由 SQL Server 2000 转换为 UCS-2),并设置正确的 TDS 版本。YMMV,但我会试一试。

于 2014-05-08T12:30:36.413 回答