
当使用mariadb Python驱动连接数据库时,若dbconfig.ini中密码字段被括号(如(mypassword))包围,configparser会将其原样读取,导致实际传递的密码含多余括号而认证失败;而命令行客户端自动忽略括号,因此手动测试能成功。
当使用mariadb python驱动连接数据库时,若dbconfig.ini中密码字段被括号(如(mypassword))包围,configparser会将其原样读取,导致实际传递的密码含多余括号而认证失败;而命令行客户端自动忽略括号,因此手动测试能成功。
这个问题看似神秘,实则源于 Python configparser 模块对配置值的字面量解析规则:它不会自动剥离值两端的括号、引号或其他符号——与 shell 解析逻辑完全不同。
例如,若你的 dbconfig.ini 文件内容如下:
[DEFAULT] server = localhost username = myuser password = (secret123) port = 3306 database = testdb
那么 config_default["password"] 的值就是字符串 "(secret123)"(含左右括号),而非 "secret123"。MariaDB 驱动会严格使用该字符串进行认证,自然返回 Access denied。
✅ 正确写法(无括号、无引号):
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
立即学习“Python免费学习笔记(深入)”;
[DEFAULT] server = localhost username = myuser password = secret123 port = 3306 database = testdb
⚠️ 注意事项:
-
configparser默认不支持类似 shell 的去括号/去引号行为(即使使用双引号"或单引号'包裹,也会被当作密码一部分); - 若密码本身需包含等号
=、井号#或分号;,应使用反斜杠转义(如pass\=word),或改用configparser.ExtendedInterpolation()并确保配置格式合规; - 建议在连接前添加调试输出,显式检查实际加载的凭证:
print(f"→ Using password: '{config_default['password']}' (length: {len(config_default['password'])})") - 更安全的做法是避免在配置文件中明文存储密码,改用环境变量或密钥管理服务(如
os.getenv("DB_PASSWORD"))。
总结:Python 的 configparser 是“所见即所得”,绝不做隐式清洗。连接失败时,优先验证 print() 输出的连接命令与代码中实际传入的参数是否完全一致——尤其关注密码字段的前后空白、括号、引号等不可见字符。

















