Python配置数据库连接时为何自定义空对象属性为元组类型?
问题根因
你遇到的所有异常,根源都来自赋值语句末尾多余的逗号触发了Python的隐式元组创建规则:
- Python语法中,单值后紧跟逗号,会自动将值封装为单元素元组,不需要额外写圆括号
- 你写的这几行赋值代码每一行末尾都带了逗号:
这就导致每个属性拿到的不是配置里的原始字符串/整数,而是类似dbConfig.host = settings.DATABASES[settingName]["HOST"], dbConfig.port = settings.DATABASES[settingName]["PORT"], dbConfig.user = settings.DATABASES[settingName]["USER"], dbConfig.password = settings.DATABASES[settingName]["PASSWORD"],('172.16.18.2',)、('5432',)的单元素元组,和你打印输出的结果完全匹配。 - 你代码里最后一行
dbConfig.dbName的赋值没有带末尾逗号,这个属性的值就是正常的原始类型,也侧面验证了多余逗号是问题的核心诱因。 - psycopg2连接时读取port参数,会把元组转成字符串拼接,最终传进去的端口值是带括号、逗号的非法字符串
"('5432',",自然无法解析成合法的端口号,触发端口无效的报错。
修复方案
- 删掉所有赋值行末尾多余的逗号,Python的赋值语句不需要用逗号做行结束标记
- 注意PostgreSQL的port参数要求传入整数类型,若配置中读取到的端口是字符串格式,需要提前做类型转换
修正后的配置读取代码示例:
def getDbPoolConfig(self): settingName = "pool" dbConfig = EmptyObject() dbConfig.host = settings.DATABASES[settingName]["HOST"] dbConfig.port = int(settings.DATABASES[settingName]["PORT"]) dbConfig.user = settings.DATABASES[settingName]["USER"] dbConfig.password = settings.DATABASES[settingName]["PASSWORD"] dbConfig.dbName = settings.DATABASES[settingName]["NAME"] return dbConfig
小提示:这是Python开发的高频入门坑,很多从其他强类型编译语言转过来的开发者,会习惯性在每行代码末尾加结束标记,容易误触发元组的隐式创建。
内容的提问来源于stack exchange,提问作者EggBender
相关产品推荐
相关产品推荐

