2014-02-25 28 views
0

我试图修补this bug并且遇到问题。 django-pyodbc是django的SQL Server后端,并且该错误导致任何sql在python 3.x中被转换为字节类型,当它试图执行时会引发TypeError(必须是字符串或unicode)。修补django-pyodbc中的错误

这里是一个程序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.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,我不知道如何编辑egg文件。我真的在我的智慧结束。这是我第一次进入python和django,并且我会坚持使用ruby和rails,我知道如果我知道它会是如此混乱。

任何帮助非常感谢。

回答

0

我没有权限访问SQL Server 2000安装,但如果我没有记错的话,SQL Server 2000使用UCS-2而不是UTF-8编码unicode。您还需要在SQL Server 2000 IIRC中使用TDS版本7.1。自从我通过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,但我会给它一个镜头。