我正在从日志文件向数据库中大容量插入记录。偶尔(~1000行中有1行)其中一行违反主键并导致事务失败。当前,用户必须手动浏览导致失败的文件,并在尝试重新导入之前删除有问题的行。考虑到要导入的文件有数百个,这是不切实际的。
我的问题是:如何跳过将违反主键约束的记录的插入,而不必在每行之前执行SELECT
语句来查看它是否已经存在?
注意:我知道有一个非常类似的问题#1054695,但它似乎是一个特定于SQL服务器的答案,我正在使用PostgreSQL(通过Python/psycopg2导入)。
Tags:
您可以对事务执行
rollback
,也可以在引发异常的代码之前回滚到保存点(cr是游标):此代码假定有正在运行的事务,否则您将不会收到该错误消息。
Django postgresql后端creates cursors直接来自psycopg。也许将来他们会为Django游标创建一个代理类,类似于cursor of odoo。它们用following code扩展游标(self是游标):
这样,上下文可以使代码更简单,它将是:
而且代码可读性更强,因为事务处理的东西不在那里。
我将使用一个存储过程来捕获您的唯一冲突的异常。示例:
您还可以在事务中使用保存点。
Pythonish伪代码从应用程序方面进行了说明:
编辑:下面是一个在psql中实际使用的示例,它基于文档中示例的细微变化(以“>;”为前缀的SQL语句):
请注意,值3是在错误之后插入的,但仍在同一事务中!
SAVEPOINT的文档位于http://www.postgresql.org/docs/8.4/static/sql-savepoint.html。
相关问题 更多 >
编程相关推荐