2017-01-10 8 views
0

나는 API에서 긁어 모으는 정보로 데이터베이스를 지속적으로 업데이트하고 싶습니다. 내가 얻은 데이터는 불완전 할 수 있지만 대부분의 데이터가 있어야합니다. 지금까지 try/except 절을 사용하여 데이터베이스에 행을 삽입하고 행을 업데이트하는 경우를 제외합니다. 주요 문제는 어떤 행도 삭제하지 않는다는 것입니다. 주어진 시간에 서버의 데이터 복사본을 갖고 싶거나 적어도 그 서버에 가까이 있어야합니다. 어떻게 든 불완전한 데이터를 제공하는 스크레이퍼가 아닌지 확인하기 위해 삭제해야 할 행을 계속 추적해야합니다. 그건 그렇고, 나는 파이썬과 psycopg2를 사용하고있다. 저는 이것이 일반적인 문제라고 생각합니다.하지만 새로운 데이터베이스를 만드는 더 나은 솔루션을 찾지 못했습니다. 현재 가지고있는 것과 몇 번 업데이트하고 데이터베이스를 교체하십시오. 어떤 제안? 나는 또한 여기서 예외 조항이 자주 발생하기를 기대한다는 사실을 좋아하지 않는다 ....postgresql의 업데이트/삽입 및 삭제를 통해 데이터베이스를 복사합니다.

미리 감사드립니다!

답변

1

upsert가 부족하다면 (MySQL INSERT ... ON DUPLICATE KEY UPDATE에 해당) 오랫동안 Postgresql 측에서 불거졌습니다. 일반적으로 귀하의 접근 방법이 최선의 방법입니다. 그러나, 그것은 원 자성이 아니라는 점에서 예외가 있습니다. 예외가 던져서 시도하고 업데이트하는 사이에 행은 다른 프로세스에 의해 업데이트되었을 수 있습니다. 종종 이것은 불변 행을 만드는 사람들을 이끌지 만 또 다른 주제입니다.

Postgres 9.5 버전부터 Upsert 절이 추가되었습니다. INSERT ... ON CONFLICT ... DO ... (Documentation here).

다른 연구에서, 여기에 훨씬 더 포괄적 인 대답이 나타납니다 : https://stackoverflow.com/a/17267423/1327710.

+0

Upsert가 좋지만 삭제를 관리하지 않습니까? 또한 데이터베이스에 ID 열을 추가하고 싶습니다. 이 유일한 유일한 열이 될 것이므로 화가 갈등이 없을 것입니다? 내가 얻은 데이터처럼 ID가 없습니다. 나는 그것이 처음 삽입 될 때 그것을 할당 할 것이다. 그런 다음 행을 일치 시켜서 어떻게 든 충돌을 일으켜 업데이트해야한다고 생각하십니까? 당신의 도움을 주셔서 감사합니다! –