如何使用 SQLAlchemy create_engine() 和包含@

How do I use SQLAlchemy create_engine() with password that includes an @

提问人:Henrietta Martingale 提问时间:2/25/2021 最后编辑:Gord ThompsonHenrietta Martingale 更新时间:11/2/2023 访问量:6227

问:

这工作原理:

db = pyodbc.connect('driver={SQL Server Native Client 11.0}; server=172.30.0.194; database=db;uid=someuser; pwd=fancy@password')

这不

cn_string = "mssql+pyodbc://someuser:"fancy&password"@172.30.0.194/db?driver=SQL+Server+Native+Client+11.0"
return create_engine(cn_string)

这也不是:

driver = "SQL Server Native Client 11.0"
server = "192.30.0.194"
database = "EPM_Dashboard"
uid = "someuser"
pwd = "fancy@password"
params = f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};UID={uid};PWD={{{pwd}}};'

connection_string = 'mssql+pyodbc:///?odbc_connect=%s' % urllib.parse.quote_plus(params)

return create_engine(connection_string)

我得到类似的东西:

登录超时已过期 (0);[08001] [Microsoft] [SQL Server 本机客户端 11.0] 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。检查实例名称是否正确,以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。(53)

如果 pyodbc 项目失败,这将更可信。

这是另一个失败:

return create_engine(urllib.parse.quote_plus('driver={SQL Server Native Client 11.0}; server=172.30.0.194; database=EPM_Dashboard;uid=someuser; pwd=fancy@password'))
    

我敢肯定,我缺少一个棘手的角色。

以下是一些资源

https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-databases

SQL 密码中的特殊字符

使用 FreeTDS 的 pyodbc 连接字符串的 SqlAlchemy 等效项

sql-server python-3.x sqlalchemy

评论

0赞 Charlieface 2/25/2021
这不是身份验证错误,而是超时。检查防火墙是否已打开,SQL Server 是否已启用远程连接,以及是否启用了 TCP 侦听
0赞 Henrietta Martingale 2/26/2021
我认为所有这些都很好的原因是因为在同一台计算机上 pyodbc 可以工作。只是 sqlalchemy create_engine不起作用
0赞 Charlieface 2/26/2021
这是做什么的,这是为 sqlalchemy 创建连接字符串的正确方法吗?(不知道,我自己从来没有用过)urllib.parse.quote_plus
0赞 Henrietta Martingale 2/26/2021
我想它放入了 html 实体或其他东西。这是第一个链接使用的。我以为是相同的编码。看起来sa可能有自己不同的编码器?所有这些语言,这就是为什么我们需要垄断软件的原因

答:

10赞 Gord Thompson 2/26/2021 #1

如果你需要构造一个可能包含“有趣字符”的连接 URL,那么你可以使用 URL.create() 为你构建它:

import sqlalchemy as sa

connection_url = sa.URL.create(
    "mssql+pyodbc",
    username="someuser",
    password="fancy@password",
    host="192.30.0.194",
    database="EPM_Dashboard",
    query={"driver": "SQL Server Native Client 11.0"},
)
engine = sa.create_engine(connection_url)

对于那些好奇的人,URL 的字符串化版本是

print(connection_url.render_as_string(hide_password=False))
# mssql+pyodbc://someuser:fancy%[email protected]/EPM_Dashboard?driver=SQL+Server+Native+Client+11.0

但请注意,在将 URL 对象传递给 之前,没有必要将 URL 对象转换为字符串。create_engine()

评论

4赞 Be Chiller Too 6/1/2021
如果需要指定端口,可以执行host="192.30.0.194,1433"
0赞 Gord Thompson 11/16/2022
注意:该语法特定于 SQL Server。 如果我们使用URL.create()host="192.30.0.194", port=49242