如何在Postgres中使用[Insert into...select]语句插入元组,而不是[Insert into...values]方法
我刚接触这个,正在尝试用Python把数据插入到这个Postgres表里,代码是这样的:
cur.execute('''INSERT INTO trademarks_image_mark (trademarks_id, image_mark_id)
SELECT currval('trademarks_id_seq'), id FROM image_mark WHERE
image_file_name LIKE %s''', data['ImageFileName'])
但是我一直遇到这个错误:
TypeError: 在字符串格式化时并不是所有参数都被转换
有没有人知道这可能是什么原因呢?我知道怎么用普通的插入语句像这样插入元组(%s),但是不太懂这种格式。非常感谢!
1 个回答
2
根据psycopg2 的文档,在执行查询时,即使你只插入一个参数,也必须把这些参数作为一个序列传递。
cur.execute('''INSERT INTO trademarks_image_mark (trademarks_id, image_mark_id)
SELECT currval('trademarks_id_seq'), id FROM image_mark WHERE
image_file_name LIKE %s''', (data['ImageFileName'],))
以下是文档中相关的部分:
对于位置变量的绑定,第二个参数必须始终是一个序列,即使它只包含一个变量。而且要记住,Python 要求在创建单元素元组时需要加一个逗号:
>>> cur.execute("INSERT INTO foo VALUES (%s)", "bar") # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar")) # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
>>> cur.execute("INSERT INTO foo VALUES (%s)", ["bar"]) # correct