mssql-django 常见问题解答

本文解答了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维护?

是的。 包mssql-django由 Microsoft 维护,可在 PyPIGitHub上使用。

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身份验证?

OPTIONSTOKEN设置中使用extra_paramsTOKEN 设置可与任何 azure.identity 凭据配合使用,包括 DefaultAzureCredentialManagedIdentityCredential

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="")

有关详细信息,请参阅 批量操作