部署Django连接Azure SQL遇自定义Schema错误及登录超时问题
问题详情
在Azure环境部署Django服务,切换数据库至Azure SQL DB时,出现架构不存在的错误:
django.db.migrations.exceptions.MigrationSchemaMissing: 无法创建django_migrations表(('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]指定的架构名称"b96c7a94-5645-4f7d-ab79-b42d99373823@2fc13e34-f03f-498b-982a-7cb446e25bc6"不存在或无使用权限。(2760) (SQLExecDirectW)'))
未在Django中指定任何架构,且数据库中存在dbo架构,可通过Python脚本正常查询或创建dbo下的表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo' -- 或创建表 CREATE TABLE dbo.Example_test ( ID INT PRIMARY KEY, Name VARCHAR(50), Age INT )
尝试在Django配置中指定dbo架构后,出现登录超时错误:
django.db.utils.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]登录超时过期(0) (SQLDriverConnect)')
配置内容如下:
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': NAME, # Initial Catalogue 'USER': USER, # Azure Client Id 'PASSWORD': PASSWORD, # Secret Key 'HOST': HOST, # Data Source 'PORT': '1433', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'extra_params': 'Authentication=ActiveDirectoryServicePrincipal', 'options': '-c search_path=dbo' }, } }
解决方案
1. 修正Django数据库配置,正确指定默认架构
-c search_path=dbo是PostgreSQL专属参数,SQL Server ODBC驱动无法识别,这是导致登录超时的直接原因。需改用SQL Server支持的方式指定默认架构:
方式一:在连接参数中添加DefaultSchema=dbo
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': NAME, 'USER': USER, 'PASSWORD': PASSWORD, 'HOST': HOST, 'PORT': '1433', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'extra_params': 'Authentication=ActiveDirectoryServicePrincipal;DefaultSchema=dbo', }, } }
方式二:通过django-mssql-backend的default_schema参数指定
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': NAME, 'USER': USER, 'PASSWORD': PASSWORD, 'HOST': HOST, 'PORT': '1433', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'extra_params': 'Authentication=ActiveDirectoryServicePrincipal', 'default_schema': 'dbo' }, } }
2. 确保Azure AD服务主体拥有dbo架构权限
错误中出现的长GUID是你的Azure AD服务主体ID,SQL Server默认会将这个ID作为服务主体的默认架构名称,但该架构未创建。需给服务主体授予dbo架构的权限:
登录Azure SQL DB,执行以下SQL:
ALTER AUTHORIZATION ON SCHEMA::dbo TO [b96c7a94-5645-4f7d-ab79-b42d99373823]; GO GRANT CONTROL ON SCHEMA::dbo TO [b96c7a94-5645-4f7d-ab79-b42d99373823]; GO
问题根源说明
- 架构不存在错误:使用
ActiveDirectoryServicePrincipal认证时,SQL Server会将服务主体的ID作为默认架构名称,而该架构未创建,导致创建迁移表失败。 - 登录超时错误:添加了SQL Server不支持的PostgreSQL参数
-c search_path=dbo,导致连接字符串格式错误,触发登录超时。
内容的提问来源于stack exchange,提问作者Sumant Agnihotri

