Django 3 连接SQL Server 2008

目前我所使用的Django是3.1.7,连接SQL Server的版本是2008 R2,SQLServer的服务器是windows 2008。这个东西已经折磨我好几天了,今天终于搞定了,于是把这个痛苦的过程记录一下。

我最开始需要完成的是要用django开发一个系统,其后端是一个十分老旧SQL Server 2005的数据库,我在网上找了很多方法,发现都不能完美的解决这个问题,最后查看了一下官方的文档,发现是因为很多python包都已经不再支持 SQL Server 2005,而支持SQL Server 2005的那几个包却又不能很好地支持Django 3(甚至是Django2)的版本了,于是我就先将SQL Server 2005升级到2008,然后使用了如下的方式:

1. 安装django-mssql-backend和pyodbc

pip install pyodbc==4.0.30
pip install django-mssql-backend==2.8.1

需要说明的是,django-mssql-backenddjango-pyodbc-azure的一个分支,能够很好的支持django2.2以后的版本,同时也支持SQL Server 2008以后的数据库版本。而django-pyodbc-azuredjango-pyodbc的一个分支,似乎只支持django 2.1的版本,对于数据库的支持也是支持到了2008以后的版本。而django-pyodbc只支持django1.4-1.10的版本,对应的数据库包括了 SQL Server 2000, 2005, 2008, and 2012。大家可以根据自己的需要来选择对应的python包。

2. 配置django数据库——修改settings.py文件

DATABASES = {
    'default': {
         'ENGINE': 'sql_server.pyodbc',
         'NAME': '<Database Name>',
         'USER': '<User Name>',
         'PASSWORD': '<Password>',
         'HOST': '<Database Host IP>',
         'PORT': '1433',
          'OPTIONS': {
              'driver':'ODBC Driver 17 for SQL Server',
              'MARS_Connection': True,
         },
     },
}

此处的driver着实花费了我一些精力,主要原因还是因为我经验不足,没有怎么用过odbc,默认写了网上的

'driver':'SQL Server Native Client 10.0'

其实,如果通过django的shell,我们可以清楚的看到,默认的pyodbc中是不包含这个驱动的:

python manage.py shell
>>> import pyodbc
>>> print(pyodbc.drivers())
['Microsoft Access Driver (*.mdb, *.accdb)', 'Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)', 'Microsoft Access Text Driver (*.txt, *.csv)']

因此,通过微软的官方网站,我又下载了一个ODBC driver,通过查阅官方文档的支持列表,我最终选择了17.3的版本——下载地址或者下载地址2
安装完以后,就可以看到pyodbc多了一个驱动,于是把这个名称填进去就可以了。

这时候,我们再执行如下命令,就会看到可以正常的进行连接了:

python manage.py shell
>>> from django.db import connections
>>> con = connections['default']
>>> con.cursor()

3. 补记

今天早上,兴冲冲的跑到办公室,想把昨天的成果在服务器上重现一下,发现彻底失败了,经过一个上午的摸索,发现测试环境中我使用的是Windows Server2008,而生产环境中使用的是Windows Server 2003,两者最大的差别,可能是2003中没有默认安装ODBC Driver 17 for SQL Server,而这个是无法在2003上安装的,于是我又回到了老路上,先修改了Driver的配置:

DATABASES = {
    'default': {
         'ENGINE': 'sql_server.pyodbc',
         'NAME': '<Database Name>',
         'USER': '<User Name>',
         'PASSWORD': '<Password>',
         'HOST': '<Database Host IP>',
         'PORT': '1433',
          'OPTIONS': {
              'driver':'SQL Server Native Client 10.0',
              'MARS_Connection': True,
         },
     },
}

然后在web服务器上,安装了这个

'driver':'SQL Server Native Client 10.0'

之后终于正常了...