【发布时间】:2010-06-26 05:44:35
【问题描述】:
我有一种情况,如果它不存在我想插入一行,如果它已经存在则不插入它。我尝试创建防止这种情况发生的 sql 查询(请参阅here),但有人告诉我一个解决方案是创建约束并在违反它们时捕获异常。
我已经设置了限制。我的问题是 - 我怎样才能捕捉到异常并继续执行更多查询?如果我的代码如下所示:
cur = transaction.cursor()
#execute some queries that succeed
try:
cur.execute(fooquery, bardata) #this query might fail, but that's OK
except psycopg2.IntegrityError:
pass
cur.execute(fooquery2, bardata2)
然后我在第二次执行时出错:
psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block
如何告诉计算机我希望它继续执行查询?我不想transaction.commit(),因为我可能想回滚整个事务(之前成功的查询)。
【问题讨论】:
-
我会推荐你的第一种方法。我认为数据库只插入不存在的行的工作要少得多。捕捉错误需要先完成工作,然后再取消,这大约是两倍的工作量。如果您一次只添加一条记录,我明白这个想法,但对于多条记录或数千条记录,我认为您最好采用第一种方式。话虽如此,我对您当前的问题没有任何有用的答案。
-
@MJB:它只会在发生错误时导致更多的工作。如果插入没有错误,那么它是一帆风顺的。因此,这取决于您是否期望获得重复密钥违规或不获得重复密钥违规会更常见。针对更常见的情况进行优化。
-
我希望经常有重复的密钥违规,所以我想这回答了我的问题!
-
@Bill:我同意规划更常见的方法。我之所以发表评论,是因为 OP 似乎还没有提供信息。现在看来是。
标签: sql database postgresql