У меня есть скрипт python, который использует адаптер Psycopg; Я разбираю массив JSON и вставляю его в свою базу данных PostgreSQL.Как Python PosGreSQL INSERT ЕСЛИ НЕ СУЩЕСТВУЕТ?
for item in data["SchoolJSONData"]:
mId = item.get("Id")
mNumofRooms = item.get("NumofRooms")
mFloors = item.get("Floors")
con = None
con = psycopg2.connect("dbname='database' user='dbuser'")
cur = con.cursor()
cur.execute('INSERT INTO Schools(Id, NumofRooms, Floors)VALUES(%s, %s, %s)',(mId, mNumofRooms, mFloors))
con.commit()
Everytime я бегу сценарий снова, я получаю следующее:
psycopg2.IntegrityError: duplicate key value violates unique constraint "schools_pkey"
Как я могу запустить скрипт вставки, так что он будет игнорировать существующие записи в базе данных?
EDIT: Спасибо за ответы все ... Я пытаюсь НЕ перезаписать любые данные, только ДОБАВИТЬ (если ПК еще не в таблице) и игнорировать любые ошибки. В моем случае я буду добавлять только новые записи, никогда не обновляя данные.
Что вы хотите, называется [upsert] (https://wiki.postgresql.org/wiki/UPSERT). Новая версия имеет [синтаксис] (http://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT). Однако, если вы используете более старую версию, посмотрите эту ветку - http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql. В принципе, вы хотите поймать исключение, но я не уверен, вы должны его игнорировать. Если ваше приложение имеет более новые данные, не лучше ли обновлять данные в БД? –
Спасибо @thatyoungman, хотя в моем варианте использования вставки никогда не будут обновляться, просто добавьте новую строку с данными, если первичный ключ еще не существует. Я рассмотрю переход на более новую версию Python и посмотрим, есть ли способ достичь этого. – Bajan
Ну, ваша проблема не связана с python, мои ссылки ссылаются на postgresql docs, а «новая версия» - PostgreSQL 9.5. –