提问人:Henrietta Martingale 提问时间:2/25/2021 最后编辑:Gord ThompsonHenrietta Martingale 更新时间:11/2/2023 访问量:6227
如何使用 SQLAlchemy create_engine() 和包含@
How do I use SQLAlchemy create_engine() with password that includes an @
问:
这工作原理:
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
答:
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
评论
urllib.parse.quote_plus