在PostgreSQL中使用Python脚本即使出错也要继续执行INSERT脚本
我正在尝试通过一个Python脚本(使用psycopg连接)批量插入数据到我的PostgreSQL数据库中。现在,这个脚本在主列上有一些重复项,这导致它中止并回滚整个脚本。不过,我想要的是跳过这些重复项,继续执行。我的脚本大致如下:
begin transaction;
create table t1 (c1 float, unique(c1));
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (1); --the script aborts and rolls back
commit;
我查了一下,发现设置ON_ERROR_ROLLBACK可以解决这个问题。但似乎这个设置只能在psql命令行中进行。
请问能否在Python脚本中使用ON_ERROR_ROLLBACK?或者有没有其他的替代方案?
提前谢谢你们!
2 个回答
-3
我有个问题:你为什么想要插入同样的值两次呢?试试这个:
INSERT IGNORE INTO table VALUES(values);
2
通常情况下,事务是用来返回到一个保存点(SAVEPOINT)的。在你的情况中,你可以直接使用普通的SQL,而不需要在事务中。所以每个语句会自动被包裹在一个开始(BEGIN)和提交(COMMIT)的块里。
INSERT INTO t1(c1) VALUES (1);
INSERT INTO t1(c1) VALUES (2);
INSERT INTO t1(c1) VALUES (1);
如果你还是想使用一个单独的事务,你可以写一个函数,并使用异常处理来处理错误:
CREATE OR REPLACE FUNCTION insertIntoT1(key INT) RETURNS VOID AS
$$
BEGIN
BEGIN
INSERT INTO t1(c1) VALUES (key);
EXCEPTION WHEN unique_violation THEN
-- Do nothing, just raise notice
RAISE NOTICE 'Key % already exists!', key;
END;
END;
$$
LANGUAGE plpgsql;
BEGIN;
CREATE TABLE t1 (c1 float, unique(c1));
SELECT insertIntoT1(1);
SELECT insertIntoT1(2);
SELECT insertIntoT1(1);
COMMIT;
关于在plpgsql中处理异常和捕获错误的更多信息,可以查看这个链接:http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING