【发布时间】:2011-05-03 10:52:50
【问题描述】:
我正在使用 Python 写入 postgres 数据库:
sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)
但由于我的某些行是相同的,我收到以下错误:
psycopg2.IntegrityError: duplicate key value
violates unique constraint "hundred_pkey"
如何编写“插入,除非该行已存在”的 SQL 语句?
我见过这样的复杂语句推荐:
IF EXISTS (SELECT * FROM invoices WHERE invoiceid = '12345')
UPDATE invoices SET billed = 'TRUE' WHERE invoiceid = '12345'
ELSE
INSERT INTO invoices (invoiceid, billed) VALUES ('12345', 'TRUE')
END IF
但首先,这是否超出了我的需要,其次,我如何将其中一个作为简单字符串执行?
【问题讨论】:
-
不管你如何解决这个问题,你都不应该这样生成你的查询。在查询中使用参数并分别传递值;见stackoverflow.com/questions/902408/…
-
为什么不捕获异常并忽略它?
-
Posgres 9.5(目前在 beta2 上)有一个类似 upsert 的新功能,请参阅:postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT
-
您是否考虑过接受这个答案? =]
-
@AP257 为什么您还没有接受任何答案?例如,Arie 的回答非常有用且获得了高度评价。
标签: postgresql sql-insert upsert