即使出错也继续执行INSERT脚本 - 使用Python脚本PostgreSQL

时间:2014-06-18 18:09:44

标签: python postgresql psycopg2

我试图使用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 个答案:

答案 0 :(得分:1)

通常,事务用于返回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

中的异常处理和陷印错误的更多信息

答案 1 :(得分:-3)

只是一个问题:为什么要两次插入相同的值? 尝试:

 INSERT IGNORE INTO table VALUES(values);