2014-02-25 33 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,但我會給它一個鏡頭。