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

Posted

技术标签:

【中文标题】当密码包含特殊字符时写入连接字符串【英文标题】:Writing a connection string when password contains special characters 【发布时间】:2022-01-17 13:55:28 【问题描述】:

我正在将 SQLalchemy 用于 Python 项目,并且我希望有一个整洁的连接字符串来访问我的数据库。比如:

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

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

我意识到我可以创建一个对象,然后像这样传递我的凭据:

drivername  = 'postgres',
username    = 'user', 
password    = 'pass', 
host        = 'host',
database    = 'database'

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

所以要明确一点,是否可以对我的连接字符串或连接字符串的密码部分进行编码 - 以便可以正确解析?

【问题讨论】:

你能举一个不能用反斜杠转义的特殊字符的例子吗? 连接信息中“X6~k9?q”后缺少“=” 无论我是否逃避它都会发生这种情况 【参考方案1】:

反斜杠不是 URL 组件字符串的有效转义字符。您需要对连接字符串的密码部分进行 URL 编码:

from urllib import quote_plus as urlquote
from sqlalchemy.engine import create_engine
engine = create_engine('postgres://user:%s@host/database' % urlquote('badpass'))

如果您查看 SQLAlchemy 中用于表示数据库连接 URL 的类的实现(在 sqlalchemy/engine/url.py 中),您可以看到它们在将 URL 实例转换为字符串时使用相同的方法来转义密码,并且解析代码使用互补的urllib.unquote_plus 函数从连接字符串中提取密码。

【讨论】:

在 Python 3 中 urllib.quote_plus 不存在,您可以使用 urllib.parse.quote_plus 对于 Python 3,有一个更新的链接 urllib.parse.quote_plus【参考方案2】:

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

urllib 模块已被拆分为多个部分,并在 Python 3 中重命名为 urllib.request、urllib.parse 和 urllib.error。

当您尝试使用包含特殊字符序列的密码连接数据库 mysql 并且您的 python 版本是 Python3 时

user_name 是您的数据库用户 IDdatabase 是您的数据库名称your_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'))

【讨论】:

以上是关于当密码包含特殊字符时写入连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

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

如何转义mysql jdbc连接字符串中的特殊字符

如何转义 RODBC 连接字符串密码中的特殊字符

在 C# 运行时读取、写入和更新 app.config 文件中的连接字符串

使用本地SQL Server的连接字符串

sqlplus连接oracle数据库--密码含特殊字符