本文解答了mssql-django有关 Microsoft Fabric 中 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 和 SQL 数据库的 Django 后端的常见问题。
General
什么是 mssql-django?
mssql-django包是由 Microsoft 维护的、用于 SQL Server 的 Django 数据库后端。 它允许 Django 应用程序使用 pyodbc 驱动程序连接到 Microsoft Fabric 中的 SQL Server、Azure SQL 数据库、Azure SQL 托管实例 和 SQL 数据库。
使用 pip 安装:
pip install mssql-django
mssql-django 支持哪些版本的 Django?
包 mssql-django v1.7 支持 Django 3.2、4.0、4.1、4.2、5.0、5.1、5.2 和 6.0。 检查 支持生命周期 ,了解完整的兼容性矩阵。
支持哪些版本的Python?
该mssql-django包支持 Python 3.8 及更高版本。 特定Python版本还必须与 Django 版本兼容。 例如,Django 5.0 需要Python 3.10 及更高版本,Django 6.0 需要Python 3.12 及更高版本。 有关完整兼容性矩阵,请参阅 支持生命周期 。
mssql-django 是否由Microsoft维护?
Configuration
我在 settings.py 中使用的引擎值是什么?
在你的DATABASES配置中将ENGINE设置为"mssql":
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"HOST": "<your-server>",
},
}
应使用哪个 ODBC 驱动程序?
使用适用于 SQL Server 的 Microsoft ODBC Driver 18。 它是 1.7 及更高版本中的默认值 mssql-django ,如果未安装版本 18,则后端会自动回退到 ODBC 驱动程序 17。 仅当您需要锁定特定版本时,才在 OPTIONS 字典中显式指定驱动程序:
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
如何连接到Azure SQL 数据库?
将完全限定的服务器名称与端口 1433 配合使用:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>.database.windows.net",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
},
},
}
如何使用Microsoft Entra身份验证?
在OPTIONS或TOKEN设置中使用extra_params。
TOKEN 设置可与任何 azure.identity 凭据配合使用,包括 DefaultAzureCredential 和 ManagedIdentityCredential。
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
token = credential.get_token("https://database.windows.net/.default").token
"TOKEN": token,
有关所有受支持的方法,请参阅Microsoft Entra身份验证。
功能
mssql-django 是否支持 JSONField?
是的,SQL Server 2016 及更高版本支持 JSONField。 JSON 数据存储为 nvarchar(max),并使用SQL Server的 JSON 函数进行查询。 有关支持的查找方式及其限制,请参阅 JSONField 支持。
mssql-django 是否支持时区感知日期/时间?
是的。 当USE_TZ=True,Django 在 SQL Server 中使用 datetimeoffset 数据类型。 如果要迁移现有数据库,则需要更改现有的 datetime2 列。 请参阅 时区支持。
是否可以调用存储过程?
是的。 使用connection.cursor()和cursor.execute()来调用存储过程。 有关包括多个参数和结果集的示例,请参阅 存储过程 。
bulk_create是否返回 ID?
默认情况下,否。 选项 return_rows_bulk_insert 默认为 False. 在你的数据库 OPTIONS 中将其设置为 True,以便在批量插入后返回 ID。 对于具有触发器的表,此选项必须保留 False 。 请参阅 批量操作。
Troubleshooting
我收到“找不到 ODBC 驱动程序”。 如何解决问题?
安装 Microsoft ODBC Driver for SQL Server。 在 Linux 上,先添加 Microsoft APT 存储库,然后安装驱动程序:
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
curl -fsSL https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
ACCEPT_EULA=Y sudo apt-get install -y msodbcsql18
在Windows,从Microsoft网站下载安装程序。 在 macOS 上,使用 Homebrew:
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
HOMEBREW_ACCEPT_EULA=Y brew install msodbcsql18
有关特定于平台的完整说明,请参阅 “安装 ”。
为什么我的迁移失败并显示“无法更改 IDENTITY 列”?
SQL Server 不支持将列更改为 IDENTITY(AutoField)列,或将 IDENTITY(AutoField)列更改为其他类型。 使用所需的字段类型创建新模型并手动迁移数据。 请参阅 mssql-django 中的限制和不支持的功能。
为什么 bulk_update 在处理可为空字段时会失败?
在 mssql-django 1.7 中,后端会自动处理所有 NULL 更新。 在较早版本中,请在bulk_update中使用default参数,以避免在CASE WHEN ... THEN NULL表达式中使用NULL,否则会导致 SQL Server 类型推断错误:
Product.objects.bulk_update(products, ["description"], default="")
有关详细信息,请参阅 批量操作 。