我正在为客户的 Azure 环境中部署 Django 服务。将数据库连接器切换到 Azure SQL 数据库时,出现以下错误:
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 脚本:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo'
or
CREATE TABLE dbo.Example_test (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT
)
我尝试在如下设置中将架构指定为 dbo:
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'
},
}
}
但是后来我得到了这个错误:
django.db.utils.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]登录超时已过期 (0) (SQLDriverConnect)')
这对我有用。
要使用服务主体连接,您需要使用此语法
作为参考,请检查此文档。
import azure.identity as ad
token = ad.ClientSecretCredential(
client_id= "xxxxxxxxxxxxxxxxxxxxxxxxxx",
client_secret= "xxxxxxxxxxxxxxxxxxxxxxx",
tenant_id="xxxxxxxxxxxxxxxxxxxxxx"
)
databaseToken = token.get_token('https://database.windows.net/.default')
DATABASES = {
'default': {
'ENGINE': 'mssql',
'NAME': 'djangodb',
'HOST':'djangodb-server.database.windows.net',
'PORT':'1433',
'TOKEN': databaseToken.token,
'OPTIONS':{
'driver':'ODBC Driver 17 for SQL Server'
}
}
}
注意:-使用此方法不会从预先创建的表中获取数据
您可以在将数据添加到模型后获取数据
使用
pyodbc
:
要从预先创建的表中获取数据,您需要使用
pyodbc
。
views.py
:
from django.shortcuts import render
from .models import Users
import pyodbc
import azure.identity as ad
import struct
def fetch_data(request):
credentials = ad.ClientSecretCredential(
tenant_id= "xxxxxxx",
client_id= "xxxxxx",
client_secret= "xxxxxxxxxx")
databaseToken = credentials.get_token('https://database.windows.net/.default')
exptoken = b''
for i in bytes(databaseToken[0], "UTF-8"):
exptoken += bytes({i})
exptoken += bytes(1)
tocken_struct = struct.pack("=i", len(exptoken)) + exptoken
Connectionstring ="Driver={ODBC Driver 17 for SQL Server};Server=tcp:djangodb-server.database.windows.net,1433;Database=djangodb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"
with pyodbc.connect(Connectionstring,attrs_before = {1256: tocken_struct}) as conn:
with conn.cursor() as cursor:
cursor.execute('select * from Users')
data = []
data = cursor.fetchall()
print(data)
return render(request, 'data.html',{'data': data})
OUTPUT
:使用
mssql-django
未从表中获取数据。
使用
pyodbc
: