如何使用[Insert into ... select]语句在postgres中插入元组,而不是[Insert into ... values]方法

时间:2014-07-10 19:57:50

标签: python sql postgresql psycopg2

我知道这一点,并试图在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:并非在字符串格式化期间转换所有参数

有谁知道为什么会这样?我知道如何使用常规Insert转换为... values语句来插入像(%s)这样的元组,但不是这种格式。非常感谢和感谢!

1 个答案:

答案 0 :(得分:2)

psycopg2 docs中所述,您必须将插入的参数作为序列传递给查询,即使只有一个:

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

以下是文档中的相关部分:

  

对于位置变量绑定,第二个参数必须始终为a   序列,即使它包含单个变量。记得那个   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