首页 > 解决方案 > 如果表为空,则执行 INSERT 多个值 POSTGRES

问题描述

我正在尝试在 postgres 表中添加一些默认值。我可以添加一个值,但我想添加 5 个默认值。我在下面尝试过,但它只创建一个值,因为在插入第一个值后,空条件不再有效。

records_to_insert = [( 1,'foo', 30, 2, True),
                   ( 2,'bar', 60, 3, False),
                   ( 3,'hero', 95, 2, False),
                   ( 4,'borth', 45, 1, True),
                   ( 5,'here', 30, 2, True)]
sql_insert_query = """ INSERT INTO tester (id, name, time, rating,others)
                SELECT %s,%s,%s,%s,%s
                WHERE NOT EXISTS (SELECT * FROM tester) """
cursor = connection.cursor()
#executemany() to insert 3 rows
result  = cursor.executemany(sql_insert_query, records_to_insert)

我正在使用 python3 和 postgres10.5。我也看过这个这个这个,但没有骰子。

标签: pythonpython-3.xpostgresqlpsycopg2

解决方案


利用psycopg2.extras.execute_values(cur, sql, argslist, template=None, page_size=100)

使用带有一系列参数的 VALUES 执行语句。参数:

  • cur – 用于执行查询的游标。
  • sql - 要执行的查询。它必须包含一个 %s 占位符,它将被一个 VALUES 列表替换。(...)

您应该重新制定要使用的查询VALUES

from psycopg2.extras import execute_values

sql_insert_query = """ 
    INSERT INTO tester (id, name, time, rating, others)
    SELECT * FROM (VALUES %s) s
    WHERE NOT EXISTS (SELECT 1 FROM tester) """
execute_values(cursor, sql_insert_query, records_to_insert)

推荐阅读