2016-01-25 8 views
0

У меня есть скрипт 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: Спасибо за ответы все ... Я пытаюсь НЕ перезаписать любые данные, только ДОБАВИТЬ (если ПК еще не в таблице) и игнорировать любые ошибки. В моем случае я буду добавлять только новые записи, никогда не обновляя данные.

+0

Что вы хотите, называется [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. В принципе, вы хотите поймать исключение, но я не уверен, вы должны его игнорировать. Если ваше приложение имеет более новые данные, не лучше ли обновлять данные в БД? –

+0

Спасибо @thatyoungman, хотя в моем варианте использования вставки никогда не будут обновляться, просто добавьте новую строку с данными, если первичный ключ еще не существует. Я рассмотрю переход на более новую версию Python и посмотрим, есть ли способ достичь этого. – Bajan

+0

Ну, ваша проблема не связана с python, мои ссылки ссылаются на postgresql docs, а «новая версия» - PostgreSQL 9.5. –

ответ

0

Нет единственного способа решить эту проблему. Кроме того, эта проблема имеет мало общего с python. Это допустимое исключение, генерируемое базой данных (не только postgre все базы данных будут делать то же самое).

Но вы можете попробовать - поймать это исключение и продолжить плавно позже. OR
вы можете использовать «select count (*) где id = mId», чтобы убедиться, что он уже не существует.

+0

postgres 9.5 поддерживает upserts https://wiki.postgresql.org/wiki/UPSERT – kwarunek

Смежные вопросы