目前我所使用的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-backend
是django-pyodbc-azure
的一个分支,能够很好的支持django2.2以后的版本,同时也支持SQL Server 2008
以后的数据库版本。而django-pyodbc-azure
是django-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'
之后终于正常了...