使用psycopg2向PostgreSQL插数时调用addRecord报缺失val9参数TypeError的解决方法
报错根本原因
你写的addRecord是数据库连接类里的实例方法,这种方法的第一个固定形参self,只有通过类实例调用时才会被Python自动填充——正常通过实例调用方法时,你只需要传后面9个业务参数即可,解释器会自动把实例本身绑定到self的位置。
但你的代码是直接拿类本身DatabaseConnection去调用addRecord,根本没有生成类实例。这种场景下Python不会帮你自动填充self的绑定值,你传入的9个业务参数(val1到val9)会被按顺序依次匹配方法的全部形参:
- 第1个实参
val1→ 绑定给形参self - 第2个实参
val2→ 绑定给形参val1 - 第3个实参
val3→ 绑定给形参val2 - ...
- 第9个实参
val9→ 绑定给形参val8
方法的形参总共有10个(self + val1到val9),你只传了9个实参,最后一个形参val9就完全没有对应的入参,因此触发了missing 1 required positional argument: 'val9'的报错。这个报错提示很有迷惑性:你明明打印出了val9的有效值,却被提示缺少val9参数,本质是参数错位绑定导致的,和val9本身有没有值没有关系。
修复方案
- 按照实例方法的标准调用逻辑,先实例化数据库连接类,拿到绑定了真实连接、游标的实例对象后,再调用实例方法。此时Python会自动把实例对象传给
self形参,你传入的9个业务值会精准匹配val1到val9的形参,不会出现错位问题。示例代码:
# 先实例化类 db_conn = DatabaseConnection() # 确认val9值 print("Val9 value is " + val9) # 通过实例调用方法 db_conn.addRecord( val1, val2, val3, val4, val5, val6, val7, val8, val9 )
- 特殊场景下如果确实需要不实例化、直接通过类调用方法,可以将
addRecord调整为静态方法,去掉方法定义里的self形参,但要确保方法内用到的cursor、connection是类级别的共享属性,否则会因为访问不到实例级的连接对象触发新的报错。
内容的提问来源于stack exchange,提问作者Süleyman Ali Akpınar
相关产品推荐
相关产品推荐

