Django MSSQL 尝试连接某些任意模式而不是 dbo

问题描述 投票:0回答:1

我正在为客户的 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)')

django azure-sql-database pyodbc
1个回答
0
投票

这对我有用。

要使用服务主体连接,您需要使用此语法

作为参考,请检查此文档

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

© www.soinside.com 2019 - 2024. All rights reserved.