python - 如果表为空,则执行 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)
解决方案
利用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)
推荐阅读
- vhdl - I have a vivando project and when I try to create a port map in one of my vhdl programs,I get errors that I don't know how to resolve
- java - Highlight words in a webview in android
- java - 如何仅在下一个(相同)标签之前获取元素?
- scala - 将 Future[Option[String]] 转换为 Future[String]
- android - 如何使用带有 RxJava 的 Retrofit GET 方法获得以下响应
- java - 打印升序列表后如何重新打印原始列表?
- reactjs - 单击子菜单时,左侧导航菜单不会保持突出显示
- c# - ASP.NET、MVC、C#、AJAX、DevExpress XPO、xmlhttp 请求不会从服务器返回任何内容
- java - Dspring 配置位置不匹配
- c - 如何正确调用我创建的函数到主函数?