大家好

 
最近重新安裝 django 到 windows server MSSQL 2019 時候
又遇到一個問題
 
File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 232, in _cursor
    self.ensure_connection()
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 216, in ensure_connection
    self.connect()
  File "C:\Python37\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 216, in ensure_connection
    self.connect()
  File "C:\Python37\lib\site-packages\django\db\backends\base\base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "C:\Python37\lib\site-packages\sql_server\pyodbc\base.py", line 307, in get_new_connection
    timeout=timeout)
django.db.utils.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC 驅動程式管理員] 找不到資料來源名稱且未指定預設的驅動程式 (0) (SQLDriverConnect)')
TEST 818105  D:\test_django\test\test\settings.ini
Performing system checks...
 
當我要連線DB時候會發現這樣的錯誤
之前我使用 MSSQL 2017的時候還沒這問題
但是我把它移動到 SERVER 是 SQL 2019的時候跑出這錯誤
 
 
研究後發現是設定值的問題
 
DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'nlp',
        'HOST':'127.0.0.1\SQLEXPRESS',
        'USER':'root',
        'PASSWORD':'123456',
        'PORT':'54321',
        'OPTIONS':{
            'provider':'sqloledb',
            #'provider':'SQLEXPRESS',
            #'extra_params':'DataTypeCompatibility=80;MARS Connection=True'
            #'host_is_server': True,
            'DRIVER':'SQL Server Native Client 11.0',    #原本只有這個
            'driver':'SQL Server Native Client 11.0',    #新增了這個
            'MARS_Connection': True,
        }
    },
}
 
但是修改後還是有以下錯誤
 
results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File "C:\Python37\lib\site-packages\django\db\models\sql\compiler.py", line 1052, in execute_sql
    sql, params = self.as_sql()
  File "C:\Python37\lib\site-packages\sql_server\pyodbc\compiler.py", line 176, in as_sql
    supports_offset_clause = self.connection.sql_server_version >= 2012
  File "C:\Python37\lib\site-packages\django\utils\functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Python37\lib\site-packages\sql_server\pyodbc\base.py", line 395, in sql_server_version
    raise NotSupportedError('SQL Server v%d is not supported.' % ver)
django.db.utils.NotSupportedError: SQL Server v15 is not supported.
 
發現是 sql_server 套件的支援度問題
可以修改(套件中的路徑)
C:\Python37\Lib\site-packages\sql_server\pyodbc\base.py
 
# 在 154 左右
    _sql_server_versions = {
        10: 2008,
        11: 2012,
        12: 2014,
        13: 2016,
        14: 2017,
        15: 2019, #新增 2019 版本對應
    }
 
因為其實新版語法並沒有改變很多
所以可以直接支援
 
 
給大家參考囉