Как подключиться к базе данных SQL Azure с помощью Python SQL Alchemy с помощью встроенной аутентификации Active Directory - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь подключиться к базе данных SQL Azure, используя SQL Alchemy в python.База данных была недавно перемещена в Azure из локальной сети, и, насколько я понимаю, Azure не поддерживает проверку подлинности Windows.
Я могу подключиться к базе данных из SSMS с помощью встроенной проверки подлинности Active Directory.

Когда Db былна прем я бы использовал следующую строку подключения, и она работала:

"mssql+pyodbc://@*Server*/*DB*?driver=SQL Server"

Я пробовал несколько других строк подключения и не могу заставить его работать.

"mssql+pyodbc://@*Server*/*DB*?driver=SQL Server?Integrated Security=true"
"mssql+pyodbc://@*Server*/*DB*?driver=SQL Server?Trusted_Connection=true"

Я получаю следующую ошибку, похоже, что sql alchemy пытается подключиться через Windows Auth по умолчанию. Есть ли в любом случае, я могу это исправить?

(pyodbc.Error) ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver][SQL Server]Windows logins are not supported in this version of SQL Server. (40607) (SQLDriverConnect); [HY000] [Microsoft][ODBC SQL Server Driver][SQL Server]Windows logins are not supported in this version of SQL Server. (40607)')
(Background on this error at: http://sqlalche.me/e/dbapi)

1 Ответ

1 голос
/ 08 июля 2019

Как я знаю, все ваши потребности в официальном документе Using Azure Active Directory with the ODBC Driver.

Во-первых, только версия 17 драйвера odbc для MS SQL Server поддерживает встроенную проверку подлинности Active Directory, если вы хотите подключиться к базе данных SQL Azure с помощью pyodbc. Поэтому, пожалуйста, убедитесь, что вы установили последний драйвер odbc для SQL Server, или вы можете скачать с https://docs.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server?view=sql-server-2017.

Во-вторых, следуйте указаниям UI Additions for Azure Active Directory (Windows driver only), чтобы настроить DSN для встроенной аутентификации Azure Active Directory в SQL Azure.

Затем вы можете следовать приведенному ниже коду для подключения к SQL Azure с помощью SQL Alchemy с pyodbc.

from urllib import parse
from sqlalchemy import create_engine

connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:<your sql azure server name>.database.windows.net,1433;Database=<your database name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryIntegrated'
params = parse.quote_plus(connecting_string)

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
result = connection.execute("select 1+1 as res")
for row in result:
    print("res:", row['res'])
connection.close()

Примечание. Значение строки подключения, приведенное выше, можно скопировать на вкладке `` на портале Azure, но, пожалуйста, обратите внимание на изменение версии драйвера odbc и удаление параметров UID и PWD.

enter image description here

Для подключения с использованием Windows Integrated или Active Directory Integrated (Только для драйвера Windows) аутентификация, укажите Аутентификация = ActiveDirectoryIntegrated в строке подключения. Водитель автоматически выберет правильный режим аутентификации. UID и PWD указывать не нужно.

Или вы можете использовать Authentication=ActiveDirectoryPassword, что будет проще, чем Authentication=ActiveDirectoryIntegrated и код, приведенный ниже.

from urllib import parse
from sqlalchemy import create_engine

your_user_name = '<your AAD user or configured in SQL Azure Server as the figure below>'
your_password_here = '<your AAD account password>'
#connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:sqlserverleon.database.windows.net,1433;Database=dbleon;Uid='+your_user_name+';Pwd='+your_password_here+';Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryPassword'
connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:sqlserverleon.database.windows.net,1433;Database=dbleon;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryIntegrated'
params = parse.quote_plus(connecting_string)

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
result = connection.execute("select 1+1 as res")
for row in result:
    print("res:", row['res'])
connection.close()

enter image description here

Надеюсь, это поможет.

...