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,多半是权限问题。
配置django settings
在 project 的 settings.py 中添加新的数据库设定,示例一枚:
就是这么简单。然后惯例 ./manage.py shell 测试一下
如果能正常获得query结果说明一切正常。
因为我只是需要在一个APP的Views里通过 Raw SQL 来查询远程MSSQL的数据库,并不用在Model中使用它,所以并没有配置数据库路由,有需要的话可以参见Django的 Multiple databases 参考手册。
这个方法不仅适合MSSQL,对所有支持 ODBC 的 Database Server 应该都适用,说起来这都得感谢开放的微软同志呢。