SqlAlchemy Правильный способ создания URL-адреса для движкаPython

Программы на Python
Anonymous
SqlAlchemy Правильный способ создания URL-адреса для движка

Сообщение Anonymous »

Каков наилучший/правильный способ создания URL-адреса, который необходимо передать в sqlalchemy.create_engine? https://docs.sqlalchemy.org/en/20/core/ ... ate_engine
Моя строка подключения выглядит примерно так:

Код: Выделить всё

con_str = "Driver={ODBC Driver 17 for SQL Server};Server=tcp:somedb.database.windows.net,1433;Database=somedbname;Uid=someuser;Pwd=some++pass=;Encrypt=yes;TrustServerCertificate=no"
Если да (подключение к SQL Server 2012 с использованием sqlalchemy и pyodbc):

Код: Выделить всё

import urllib

import sqlalchemy as sa

connection_url = sa.engine.URL.create(
"mssql+pyodbc",
query={"odbc_connect": urllib.parse.quote_plus(con_str)},
)

print(connection_url.render_as_string(hide_password=False))
Я получаю следующий результат:

Код: Выделить всё

mssql+pyodbc://?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3Asomedb.database.windows.net%2C1433%3BDatabase%3Dsomedbname%3BUid%3Dsomeuser%3BPwd%3Dsome%2B%2Bpass%3D%3BEncrypt%3Dyes%3BTrustServerCertificate%3Dno
Но если я это сделаю (Как использовать SQLAlchemy create_engine() с паролем, содержащим @):

Код: Выделить всё

connection_url = sa.engine.URL.create(
drivername="mssql+pyodbc",
username="someuser",
password="some++pass=",
host="tcp:somedb.database.windows.net",
port=1433,
database="somedbname",
query={'driver': 'ODBC Driver 17 for SQL Server', 'encrypt': 'yes', 'trustservercertificate': 'no'},
)

print(connection_url.render_as_string(hide_password=False))
Я получаю другой результат:

Код: Выделить всё

mssql+pyodbc://someuser:some++pass%3D@[tcp:somedb.database.windows.net]:1433/somedbname?driver=ODBC+Driver+17+for+SQL+Server&encrypt=yes&trustservercertificate=no
Оба они работают для общего чтения, но для более непонятного использования они дают разные результаты.
Например, для определенный фрагмент кода, первый вариант работает, а второй выдает:

('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Неявное преобразование типа данных nvarchar(max) в двоичный формат не допускается. Для выполнения этого запроса используйте функцию CONVERT. (257) (SQLExecDirectW)').

Я предполагаю, что первое верно, поскольку в большинстве ответов StackOverflow оно приводится в качестве примера. Меня интересует, почему разные параметры дают такие разные результаты и где об этом можно прочитать на https://docs.sqlalchemy.org/?

Подробнее здесь: https://stackoverflow.com/questions/781 ... for-engine

Вернуться в «Python»