SqlAlchemy 为引擎创建 url 的正确方法

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

创建需要传递给

url
sqlalchemy.create_engine
的最佳/正确方法是什么? https://docs.sqlalchemy.org/en/20/core/engines.html#sqlalchemy.create_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"

如果我这样做(使用 sqlalchemy 和 pyodbc 连接到 SQL Server 2012 ):

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/?

python sql-server sqlalchemy
1个回答
0
投票

我不使用这个数据库或驱动程序,但文档中有一些关于您的示例的信息。看来两者都支持。

传递精确的pyodbc字符串

  • 在这种情况下,文档不使用 urllib.parse.quote_plus,也许可以尝试不使用它?也许它会回落到不同的驱动程序?

主机名连接

  • 他们的
    "trustservercertificate"
    写为
    "TrustServerCertificate"
    ,这可能并不重要,因为文档只提到
    "driver"
    是特殊的
© www.soinside.com 2019 - 2024. All rights reserved.