我试图使用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?或者还有其他选择吗?
提前致谢!
答案 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);