psycopg2 在字符串格式化期间并非所有参数都已转换

psycopg2 not all arguments converted during string formatting

我正在尝试使用 psycopg2 从 python 列表中向 table 中插入一行,但在字符串格式设置方面遇到了问题。

table有4列类型(1043-varchar, 1114-timestamp, 1043-varchar, 23-int4)。我也尝试用 1082-date 代替时间戳,用 21-int2 代替 int4。

以下语句在 pgAdmin 中或通过没有字符串格式的 psycopg2 游标执行都可以正常工作:

INSERT INTO ssurgo.distmd VALUES ('5', '2015-01-01', 'Successful', 4891);

但是,如果我这样做:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;"
data  = ['5', '2015-01-01', 'Successful', 4891]
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime
print(curs.mogrify(sql_text, data))

我得到:

TypeError: not all arguments converted during string formatting

如果我将日期保留为“2015-01-01”字符串而不是 datetime.date 对象,并且如果我使用 curs.execute(sql_text , 数据) 而不是 mogrify.

我正在传递一个列表,所以我认为这与我在其他问题中发现的创建非字符串序列所必需的更常见的单元组错误无关,并且显式转换为元组确实如此未修复错误。

有谁知道为什么 psycopg2 字符串格式会出错?

感谢@Keith 的帮助。我期待 psycopg2 比实际做的更多。由于我正在开发一个脚本来遍历数百个文本文件以导入到不同的 tables,我想要一些可以使用不同 table 大小的东西并进行了以下修改:

sql_text = "INSERT INTO ssurgo.distmd VALUES (%s);"
data  = ['5', '2015-01-01', 'Successful', 4891]
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime
placehold = ['%s' for _fld in data]
sql_text = sql_text % ', '.join(placehold)
print(curs.mogrify(sql_text, data))

您可以保留原始代码,但传入元组而不是列表:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;"
data  = ('5', date.today(), 'Successful', 4891)
print(curs.mogrify(sql_text, [data]))

请注意,您传递的是单个值,因此有必要将其包装在 Psycopg 所期望的可迭代对象中。元组将由 Psycopg 调整为正确的 values 语法:记录