2017-09-27 2 views
0

db에서 mail-id가 기본 키인 register라는 테이블이 있습니다. 이전에 session.add_all()을 사용하여 일괄 제출했습니다. 그러나 때로는 일부 레코드가 이미 존재합니다. 이 경우 기존 레코드와 기존 레코드를 분리하고 싶습니다. 이것에 대한단일 쿼리에서 기본 키 목록이 이미 DB에 있는지 확인하는 방법?

+0

어떤 DB를 사용하고 계십니까? –

+0

Postgres를 사용 중입니다. – katrik

+0

새로운 [INSERT ... ON CONFLICT DO NOTHING] (http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert)을 활용할 수 있습니다.) 최소한 데이터를 가져 오기위한 것입니다. 최근의 Postgres를 사용하고 있다면. –

답변

-1

사용자 SQL ALchemys 관리자 :

inspector = inspect(engine) 
inspector.get_primary_keys(table, schema) 

인스펙터는 모든 기본 키를 "반영"당신은 반환 목록 agaist 확인할 수 있습니다. 데이터베이스에 추가하는 모든 개체가 완료되면

+0

나는 그들이 실패한 대신 기존 키를 건너 뛸 대량 삽입물의 형태라고 생각합니다. 그들은 기본 키 ("mail-id")로 구성되는 열을 알고있는 것 같습니다. –

1

http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.merge

Session.merge()을 사용할 수 있습니다 (예를 들어, 새로운 객체는 적어도 데이터베이스에 기록을 위해 존재하는 모든 정보를 포함). 효과적으로 merge()은 기존 행을 만들거나 업데이트합니다 (기본 키가 세션/데이터베이스에있는 경우 기본 키를 찾고 병합 한 개체에서 상태를 복사 함). 주목할 점은 병합에 전달 된 개체의 특성 값이 이미 데이터베이스에 있던 개체의 특성 값을 덮어 쓰게된다는 점입니다.

성능 측면에서 그리 좋지는 않습니다. 그렇다면 SQLAlchemy에는 대량 작업이 포함되어 있습니다. 추가/업데이트 될 기본 키 집합의 존재를 확인하고 존재하지 않는 개체에 대해 한 번 대량 삽입하고 수행 한 개체에 대해 하나의 대량 업데이트를 수행해야합니다. 이 문서는 고성능 접근 방식 일 필요가있는 경우 대량 작업에 대한 정보를 제공합니다.

http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations

+0

안녕하세요, Rach, Merge는 저에게 잘 돌아갑니다.하지만 기본 키가 이미 최적화 된 방식으로 표시되도록하고 싶습니다. – katrik