Python psycopg2在字符串格式化期间未转换所有参数

Python psycopg2在字符串格式化期间未转换所有参数,python,postgresql,python-2.7,psycopg2,Python,Postgresql,Python 2.7,Psycopg2,我试图使用psycopg2从python列表向表中插入一行,但字符串格式有问题 该表有4列类型(1043 varchar、1114 timestamp、1043 varchar、23-int4)。我也尝试过用1082日期代替时间戳,用21-int2代替int4 以下语句在pgAdmin中或通过psycopg2游标执行(无字符串格式)可以正常工作: INSERT INTO ssurgo.distmd VALUES ('5', '2015-01-01', 'Successful', 4891);

我试图使用psycopg2从python列表向表中插入一行,但字符串格式有问题

该表有4列类型(1043 varchar、1114 timestamp、1043 varchar、23-int4)。我也尝试过用1082日期代替时间戳,用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_文本,数据)而不是mogrify,则会出现相同的错误

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


有人知道为什么psycopg2字符串格式出现错误吗?

感谢@Keith的帮助。我期望psycopg2做的比实际做的更多。由于我正在开发一个脚本来迭代数百个文本文件,以便导入到不同的表中,因此我希望能够处理不同的表大小,并进行了以下修改:

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))

感谢@Keith的帮助。我期望psycopg2做的比实际做的更多。由于我正在开发一个脚本来迭代数百个文本文件,以便导入到不同的表中,因此我希望能够处理不同的表大小,并进行了以下修改:

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]))

请注意,您正在传递一个值,因此有必要将其包装在一个iterable中,这正是Psycopg所期望的。该元组将由Psycopg调整为正确的
语法:记录

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

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

请注意,您正在传递一个值,因此有必要将其包装在一个iterable中,这正是Psycopg所期望的。Psycopg将根据正确的
语法调整元组:记录

您只有一个值占位符用于四个值。您只有一个值占位符用于四个值。谢谢-这是我所期望的行为。我曾经尝试过类似的方法,但是在mogrify的第二个参数中,我尝试过转换成一个元组。我猜它必须是第二行的一个元组(不是列表),然后必须是第三行中单个项目列表的一部分。可以在mogrify参数中转换为元组,但语法很复杂。print(curs.mogrify(sql_text,[tuple(data)])工作正常,但可读性较差。谢谢-这更符合我的预期。我在这一过程中尝试了类似的操作,但在mogrify的第二个参数中尝试了转换为元组。我猜必须是第二行的元组(不是列表),然后必须是第三行中单个项目列表的一部分。可以在mogrify参数中转换为元组,但语法很复杂。print(curs.mogrify(sql_text,[tuple(data)])工作正常,但可读性较差。