
Python通过configparser读取INI文件时,若密码字段被括号(如(mypassword))包裹,会原样保留括号作为密码一部分,导致认证失败;而命令行客户端自动剥离括号,故手动执行mariadb -p(mypassword)仍能成功连接。
mariadb连接失败:配置文件中括号导致密码解析错误
在使用 mariadb Python 连接器时,一个看似神秘的 Access denied for user 错误,往往并非权限或网络问题,而是源于配置文件中肉眼难辨的格式陷阱。正如本例所示:脚本打印出的命令行可直接执行成功,但 Python 程序却持续报错——根本原因在于 configparser 对 INI 文件值的严格字面解析。
? 问题本质:configparser 不会自动去除括号
configparser 默认将配置项的值(包括首尾空格、引号、括号等)原样返回,它不执行 shell 解析逻辑。例如,若 dbconfig.ini 中写为:
[DEFAULT] username = myuser password = (secret123) server = localhost port = 3306 database = testdb
则 config_default['password'] 的值实际是字符串 "(secret123)"(含左右圆括号),而非 secret123。MariaDB 服务端校验时自然拒绝该非法密码。
而你在终端运行:
mariadb -u myuser -p(secret123) -h localhost -P 3306 testdb
Shell 会将 -p(secret123) 视为 -p 参数后跟未加引号的参数,并忽略括号(或按 shell 扩展规则处理),最终传递给客户端的真实密码仍是 secret123 ——因此成功。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
✅ 正确做法:清理密码字符串
在读取密码后,应显式去除常见干扰字符。推荐使用 str.strip() 安全去括号与空格:
import configparser
import mariadb
config = configparser.ConfigParser()
config.read('dbconfig.ini')
config_default = config['DEFAULT']
# 安全提取密码:去除首尾空格、圆括号、方括号、花括号、单双引号
raw_password = config_default['password']
clean_password = raw_password.strip(" \t\n\r()[]{}'\"")
print(f'mariadb -h {config_default["server"]} -u {config_default["username"]} -p{clean_password} -P {config_default["port"]} {config_default["database"]}')
conn = mariadb.connect(
user=config_default['username'],
password=clean_password, # ← 使用清洗后的密码
host=config_default['server'],
port=int(config_default['port']),
database=config_default['database']
)
? 提示:
strip()可一次性指定所有需移除的字符;上述调用会清除"(secret123)"、'[secret123]'、" 'secret123' "等常见格式。
⚠️ 其他注意事项
-
避免在 INI 中使用引号包裹密码:
configparser不会解析引号语义(如"pass@word!"会被读作带双引号的字符串)。如需保留特殊字符,请直接书写裸值(如password = pass@word!),并确保其未被额外符号包裹。 -
启用配置节校验:可在
configparser初始化时启用interpolation=None防止意外变量替换:config = configparser.ConfigParser(interpolation=None)
-
调试建议:始终在连接前打印
repr(password)而非password,以便清晰识别不可见字符:print(f"Raw password repr: {repr(config_default['password'])}") print(f"Clean password repr: {repr(clean_password)}")
✅ 总结
该问题不是 MariaDB 权限配置缺陷,也不是驱动兼容性问题,而是 Python 配置解析与 Shell 行为差异引发的典型“隐形陷阱”。牢记:configparser 是纯文本解析器,不是 shell 解释器。只要对敏感字段(尤其是密码)做一次 strip() 清洗,即可彻底规避此类故障,提升配置健壮性与部署可靠性。










