Django只内置了几个 Database Backend,默认并不支持 Microsoft SQL Server
( 以下用 MSSQL 代替 )。官方手册中提供的第三方 MSSQL Backend 因为依赖的问题只支持 Windows 平台,在 Linux Server 上不可用。可能很多人会问,谁会在 Linux 上用邪恶的 MSSQL 当 Django 的数据库后台,其实在企业中很多事情身不由己,各种奇葩的需求都会有,这种算是比较小儿科的了。庆幸的是微软“大发慈悲”在2012年给 Redhat 提供了官方ODBC驱动(以前得用第三方的FreeTDS),而 Django 的第三方库中有比较完善的 ODBC 支持,所以我们可以迂回实现。
实现模式:MSSQL Server -> MSSQL Server ODBC Driver -> pyodbc -> django-pyodbc -> django frontend
。
安装MSSQL Server ODBC Driver 1.0
到微软的 Download Center下载 MSSQL Server ODBC Driver ,注意目前只支持64位的 RHEL 5/6 ,理论上 CentOS 也是支持的。压缩包里的 README 有详细的安装说明,也有比较完善的Shell安装脚本,我安装的时候并没有碰到什么异常。基本步骤:
-
如果Server上已经安装有
unixODBC DriverManager
,先卸载。 -
使用压缩包中的 build_dm.sh 编译安装
unixODBC DriverManager
。 这样做的好处是可以保证 configure 的各项参数符合要求,比如MSSQL的默认unicode字符集是UTF-16,所以 configure 参数里需要有--with-iconv-ucode-enc=UTF16LE
。 -
确定
unixODBC
正确安装之后,就可以运行./install.sh install
来安装 MSSQL Server ODBC Driver了。
安装pyodbc和django-pyodbc
sudo pip install pyodbc django_pyodbc
即可。其实安装完pyodbc我们就可以在python的shell下测试了驱动是否安装成功。
import pyodbc
connection = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=127.0.0.1;DATABASE=test;UID=user;PWD=password')
cousor = connection.cursor()
如果提示无法import,多半是权限问题。
配置django settings
在 project 的 settings.py
中添加新的数据库设定,示例一枚:
'test':{
'ENGINE':'django_pyodbc',
'NAME':'test',
'HOST':'127.0.0.1',
'USER':'test',
'PASSWORD':'password',
'OPTIONS': {
'driver': 'SQL Server Native Client 11.0',
},
}
就是这么简单。然后惯例 ./manage.py shell
测试一下
from django.db import connections
cur = connections['test'].cursor()
cur.execute("SELECT * FROM testtable")
cur.fetchone()
如果能正常获得query结果说明一切正常。
因为我只是需要在一个APP的Views里通过 Raw SQL 来查询远程MSSQL的数据库,并不用在Model中使用它,所以并没有配置数据库路由,有需要的话可以参见Django的 Multiple databases 参考手册。
这个方法不仅适合MSSQL,对所有支持 ODBC 的 Database Server 应该都适用,说起来这都得感谢开放的微软同志呢。