【问题标题】:How to Python PostgreSQL INSERT IF NOT EXIST? [duplicate]如果不存在,如何 Python PostgreSQL 插入? [复制]
【发布时间】:2016-01-25 19:32:09
【问题描述】:

我有一个使用 Psycopg 适配器的 python 脚本;我正在解析一个 JSON 数组并插入到我的 PostgreSQL 数据库中。

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"  

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

编辑:感谢所有回复...我试图不覆盖任何数据,只添加(如果 PK 尚未在表中),并忽略任何错误。就我而言,我只会添加新条目,从不更新数据。

【问题讨论】:

  • 你想要的叫做upsert。新版本有一个syntax。但是,如果您使用旧版本,请查看此线程 — stackoverflow.com/questions/1109061/…。基本上,您想捕获异常,但我不确定,您应该忽略它。如果你的应用有更新的数据,更新数据库中的数据不是更好吗?
  • 谢谢@thatyoungman,虽然在我的用例中插入永远不会更新,如果主键不存在,只需添加一个新的数据行。我会考虑迁移到较新版本的 Python,看看是否有办法实现这一点。
  • 嗯,你的问题与python无关,我的链接参考postgresql docs,“新版本”是PostgreSQL 9.5。

标签: python sql postgresql psycopg


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2015-01-20
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2016-01-06
相关资源
最近更新 更多