【问题标题】:Invalid syntax ON CONFLICT when inserting to database插入数据库时​​出现无效语法 ON CONFLICT
【发布时间】:2019-05-31 15:17:19
【问题描述】:

尝试将数据插入到具有唯一约束的新空表中。当我删除 ON CONFLICT 语句时,代码会立即出错,并在第一次插入尝试中违反唯一约束,即使表为空。当我从表中删除唯一约束时,当我重新运行代码时数据会重复。

我希望插入验证该行是否存在并且什么都不做,如果它不存在,则创建一个新条目。我在 Mac OSX 上运行 postgres 11.3。任何帮助表示赞赏。

psycopg2.extras.execute_values(cur,
    "insert  into ferc_hots (html,link) values %s",
    values)
on conflict (html,link) do nothing

con.commit()  
print("Records inserted successfully")  
con.close()

【问题讨论】:

  • ON CONFLICT 应该在代码的 SQL 部分,而不是 Python 代码的一部分。
  • 不知道如何解决这个问题。当我将值之后的 ) 移动到冲突语句的末尾时仍然出现语法错误

标签: python postgresql psycopg2


【解决方案1】:

您的修复应该非常简单,因为您只是将 on conflict 行放在错误的位置。

psycopg2.extras.execute_values(cur,
    """insert  into ferc_hots (html,link) values %s
       on conflict (html,link) do nothing""", # Moved to inside SQL
    values)

con.commit()  
print("Records inserted successfully")  
con.close()

【讨论】:

  • 感谢您的回复。该代码产生以下错误:psycopg2.errors.InvalidColumnReference:“没有与 ON CONFLICT 规范匹配的唯一或排除约束”。 html 和 link 列都有唯一的约束。
  • 是否对 BOTH - 而不是每个 - 列都有一个唯一约束?
  • 每一列都有一个唯一约束,而不是两个约束:索引:"ferc_hots_html_key" UNIQUE CONSTRAINT, btree (html) "ferc_hots_link_key" UNIQUE CONSTRAINT, btree (link)
  • 那是你的问题。在您的 ON CONFLICT 子句中,您将单个约束(html、链接)指定为存在冲突 - 而不是单独的。
  • 创建唯一索引会比只为两个表创建唯一约束更好吗? stackoverflow.com/questions/23542794/….
猜你喜欢
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2021-12-24
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多