如何使用包含 @ 的密码的 SQLAlchemy create_engine()

Hen*_*ale 5 sql-server sqlalchemy python-3.x

这有效:

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

这不

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

这也不:

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)
Run Code Online (Sandbox Code Playgroud)

我得到类似的东西:

登录超时已过期(0);[08001] [Microsoft][SQL Server Native Client 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'))
    
Run Code Online (Sandbox Code Playgroud)

我确信我在某个地方缺少了一个棘手的角色。

这是一些资源

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

SQL密码中的特殊字符

SqlAlchemy 相当于使用 FreeTDS 的 pyodbc 连接字符串

Gor*_*son 13

如果您需要构建一个可能包含“有趣字符”的连接 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)
Run Code Online (Sandbox Code Playgroud)

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

print(connection_url.render_as_string(hide_password=False))
# mssql+pyodbc://someuser:fancy%40password@192.30.0.194/EPM_Dashboard?driver=SQL+Server+Native+Client+11.0
Run Code Online (Sandbox Code Playgroud)

但请注意,将 URL 对象传递给create_engine().

  • 如果需要指定端口,可以执行 `host="192.30.0.194,1433"` (4认同)