首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修补django-pyodbc中的错误

修补django-pyodbc中的错误
EN

Stack Overflow用户
提问于 2014-02-25 11:34:49
回答 1查看 111关注 0票数 0

我正在尝试修补this bug,但遇到了问题。django-pyodbc是django的SQL Server后端,该漏洞会导致任何sql转换为python3.x中的字节类型,这会在尝试执行时引发TypeError (必须是字符串或unicode)。

以下是我在my_app/pyodbc_patch/base.py (该文件夹中唯一的文件)中的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'my_app.pyodbc_patch',
        'HOST': '...',
        'NAME': '...',
        'OPTIONS': {
            'host_is_server': True
        }
    }
}

据我从django源码可以看出,django.db.utils.ConnectionHandlerDATABASES获取引擎,并让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。

非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 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代码之前,可以试试这个?

代码语言:javascript
复制
'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,但我会试一试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22004042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档