当密码包含特殊字符时写入连接字符串

我在 Python 项目中使用了 SQLlegy,我希望有一个整洁的连接字符串来访问我的数据库。例如:

engine = create_engine('postgresql://user:pass@host/database')

问题在于,我的密码包含一系列特殊字符,当我尝试连接时,这些字符会被解释为分隔符。

我意识到我可以使用 engine.URL.create(),然后像这样传递我的凭证:

import sqlalchemy as sa


connection_url = sa.engine.URL.create(
drivername="postgresql",
username="user",
password="p@ss",
host="host",
database="database",
)
print(connection_url)
# postgresql://user:p%40ss@host/database

但是如果可能的话,我更愿意使用连接字符串。

因此,为了清楚起见,是否有可能对我的连接字符串或连接字符串的密码部分进行编码,以便能够正确地解析它?

74954 次浏览

您需要对连接字符串的密码部分进行 URL 编码:

from urllib.parse import quote_plus
from sqlalchemy.engine import create_engine
engine = create_engine("postgres://user:%s@host/database" % quote_plus("p@ss"))

如果查看 SQLAlchemy 中用于表示数据库连接 URL (在 sqlalchemy/engine/url.py中)的类的实现,可以看到它们在将 URL 实例转换为字符串时使用相同的方法来转义密码。

在 Python 3. x 中,需要导入 urllib.parse.quote:

Urllib 模块被分成几部分,并在 Python3中重命名为 Request、 urllib.parse 和 urllib.error。

当您试图用包含特殊字符序列的密码连接数据库 MySQL 时,您的 python 版本是 Python 3

User _ name 是数据库的用户 ID
Database 是您的数据库名称
带有特殊字符的 your _ password password

 from urllib.parse import quote
from sqlalchemy.engine import create_engine
engine = create_engine('mysql+mysqlconnector://user_name:%s@localhost:3306/database' % quote('your_password'))