2016-01-25 22 views
0

我有一个使用Psycopg适配器的python脚本;我解析一个JSON数组并插入到我的PostgreSQL数据库中。如何Python PosgreSQL插入如果不存在?

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() 

每次我再次运行该脚本,我得到以下几点:

psycopg2.IntegrityError: duplicate key value violates unique constraint "schools_pkey" 

如何运行插入脚本,以便它将忽略数据库中的现有条目?

编辑:谢谢你的答复所有...我试图不覆盖任何数据,只有ADD(如果PK不在表中),并忽略任何错误。在我的情况下,我只会添加新的条目,而不会更新数据。

+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文档,“新版本”是PostgreSQL 9.5。 –

回答

0

解决这个问题没有单一的办法。这个问题与python无关。它是由数据库生成的有效异常(不仅仅是postgre,所有数据库都会这样做)。

但是,您可以尝试 - 抓住此异常并在以后继续顺利进行。 或
您可以使用“select count(*)where id = mId”来确保它不存在。

+0

postgres 9.5支持upserts https://wiki.postgresql.org/wiki/UPSERT – kwarunek