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

时间:2016-10-05 00:55:56

标签: python postgresql python-2.7 psycopg2

我正在尝试使用psycopg2从python列表中将一行插入到表中,但是在字符串格式化方面存在问题。

该表有4列类型(1043-varchar,1114-timestamp,1043-varchar,23-int4)。我也尝试使用1082-date而不是timestamp,而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,data)而不是mogrify。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

感谢@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))