如何连接Django与SQL Server 2008 R2?迁移时遇语法错误求助
问题
执行python manage.py migrate命令时出现以下错误:
django.db.utils.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'OFFSET'附近有语法错误。(102) (SQLExecDirectW)")
数据库配置:
DATABASES = { "default": { "ENGINE": "mssql", "NAME": "xx", "USER": "xx", "PASSWORD": "xx", "HOST": "xx", "PORT": "1433", "OPTIONS": {"driver": "ODBC Driver 17 for SQL Server", }, }, }
相关版本信息:
- SQL Server:Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)
- Python:3.8.10
- Django:3.1.7
解决方案
1. 指定SQL Server版本
SQL Server 2008 R2不支持OFFSET/FETCH分页语法,而Django默认会生成该语法。在数据库配置的OPTIONS中添加版本参数,让Django生成兼容的SQL语句:
DATABASES = { "default": { "ENGINE": "mssql", "NAME": "xx", "USER": "xx", "PASSWORD": "xx", "HOST": "xx", "PORT": "1433", "OPTIONS": { "driver": "ODBC Driver 17 for SQL Server", "sql_server_version": "2008" # 添加此参数 }, }, }
2. 确认后端库兼容性
确保安装了适配的SQL Server后端库,Django 3.1.x需要django-mssql-backend 2.8.0及以上版本才能完美支持SQL Server 2008 R2:
pip install django-mssql-backend>=2.8.0
3. 备选方案:自定义分页逻辑
如果上述方法无效,可通过自定义数据库后端的分页类,强制使用ROW_NUMBER()替代OFFSET/FETCH实现分页。但此方法复杂度较高,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Patricio Nicolas
相关产品推荐
相关产品推荐

