【问题标题】:psycopg2 not all arguments converted during string formattingpsycopg2 在字符串格式化期间并非所有参数都转换了
【发布时间】:2016-10-05 00:55:56
【问题描述】:

我正在尝试使用 psycopg2 从 python 列表中向表中插入一行,但字符串格式出现问题。

该表有 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, data) 而不是 mogrify,我会得到同样的错误。

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

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

【问题讨论】:

  • 四个值只有一个值占位符。

标签: python postgresql python-2.7 psycopg2


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢——这正是我所期待的。在此过程中,我尝试了类似的方法,但尝试在 mogrify 的第二个参数中转换为元组。我猜它必须是第二行中的元组(不是列表),然后必须是第三行中单个项目列表的一部分。
  • 可以在 mogrify 参数中转换为元组,但语法很棘手。
  • print(curs.mogrify(sql_text, [tuple(data)]) 工作,但不可读。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多