如何用Django 2.0对接遗留MS SQL Server?django-pyodbc-azure暂不支持
Django 2.0 对接遗留MS SQL Server的替代方案
我之前正好处理过Django 2.0对接遗留MS SQL Server的场景,给你几个经过实践验证的替代方案:
1. 使用 django-mssql-backend(首推)
这个库是从django-pyodbc-azure fork出来的分支,专门针对高版本Django做了兼容适配,完全支持Django 2.0,后续维护也比较稳定。
- 安装命令:
pip install django-mssql-backend - 数据库配置示例(在
settings.py中):
DATABASES = { 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': '你的数据库名称', 'USER': '数据库账号', 'PASSWORD': '数据库密码', 'HOST': '数据库主机\\实例名', # 例如 localhost\\SQLEXPRESS 'PORT': '', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', # 需提前安装对应版本的ODBC驱动 'MARS_Connection': 'True', }, } }
- 前置要求:需要先安装
pyodbc包,以及微软官方的ODBC驱动(根据你的系统和SQL Server版本选择合适的驱动,比如ODBC Driver 17/18)。
2. 直接用 pyodbc + 原生SQL/自定义模型管理器
如果你的项目对Django ORM依赖不高,或者遗留数据库的结构非常复杂(比如不符合Django的命名约定、存在特殊字段),直接用pyodbc写原生SQL会更灵活:
- 安装pyodbc:
pip install pyodbc - 简单的连接封装示例:
import pyodbc def get_mssql_connection(): conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=你的主机\\实例;' 'DATABASE=你的数据库;' 'UID=账号;' 'PWD=密码' ) return conn
- 如果想结合Django模型使用,可以自定义模型管理器,把原生查询逻辑封装进去,这样既能利用模型的数据结构,又能处理遗留数据库的复杂查询需求。
3. 临时兼容补丁(仅用于过渡)
如果你特别想继续用django-pyodbc-azure,可以参考它的issue #124里用户提交的兼容补丁,手动修改库的部分代码:
- 主要需要调整的点:Django 2.0对中间件结构、字段映射逻辑做了改动,你可以从社区提交的PR里提取修改内容,手动调整本地安装的django-pyodbc-azure代码。
- 注意:这种方式只适合临时过渡,后续库更新会覆盖你的修改,不建议长期使用。
额外提醒
- 一定要确保ODBC驱动版本和你的SQL Server版本匹配,比如SQL Server 2012及以上推荐使用ODBC Driver 17。
- 遗留数据库的表/字段如果不符合Django的命名规范,记得在模型中用
db_table、db_column参数指定映射关系。 - 测试阶段重点检查字符集和时区设置,避免出现中文乱码或时间不一致的问题。
内容的提问来源于stack exchange,提问作者Frane
相关产品推荐
相关产品推荐

