2014-06-18 6 views
0

python 스크립트 (psycopg 연결)를 사용하여 PostgreSQL DB에 대량 삽입을 시도하고 있습니다. 이제 스크립트에는 기본 열에 복제본이있어 전체 스크립트를 중단하고 롤백합니다. 그러나, 내가 원하는 것은 중복을 건너 뛰고 실행을 계속하는 것입니다. 내 스크립트오류가 있어도 INSERT 스크립트를 계속 실행하십시오 - Python 스크립트를 사용하는 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 명령 줄에서만 설정할 수 있습니다.

파이썬 스크립트 내부에서 ON_ERROR_ROLLBACK을 사용할 수 있습니까? 아니면 다른 대안이 있습니까?

미리 감사드립니다.

답변

-3

그냥 질문 : 동일한 값을 두 번 삽입하려는 이유는 무엇입니까? 시도 :

INSERT IGNORE INTO table VALUES(values); 
+0

그리고 plpgsql http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING에서 트래핑 오류 " 무시 무시한 삽입 "은 무엇을해야합니까? –

+0

insert 문을 포함하는 스크립트는 자동 생성되며 특정 오류 레코드가 중복 된 것으로 간주됩니다. 따라서 삽입 할 때 중복을 무시하려고합니다. Btw, INSERT IGNORE는 내가 원하는 것은 아니다. (PostgreSQL이 아닌 MySQL을 위해서). 세션에 대해 ON_ERROR_ROLLBACK을 설정하는 옵션과 같이 INSERT 문을 수정하지 않고도 중복을 무시하고 싶습니다. 하지만 파이썬 스크립트에서 어떻게해야하는지 정확히 모르겠습니다. – borarak

+0

발견 : http://stackoverflow.com/questions/1009584/how-to-emulate-insert-ignore-and-on-duplicate-key-update-sql-merge-with-po. – KriszDev

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; 

더 많은 예외 처리에 대한 정보와

관련 문제