在 postgres 中插入数据时,我会忽略重复键
我的表有 3 列的唯一约束。现在我在下面发布的代码仅适用于 primary_key 但不适用于唯一约束。有人有建议吗?
谢谢
E
@compiles(Insert)
def _prefix_insert_with_ignore(insert_srt, compiler, **kw):
conn = Connection()
conn_str = conn.conn_str()
test_conn = conn_str.find("sqlite")
if test_conn == 0:
return compiler.visit_insert(insert_srt.prefix_with('OR IGNORE'), **kw)
else:
#if the connection is postgresql
pk = insert_srt.table.primary_key
insert = compiler.visit_insert(insert_srt, **kw)
ondup = f"ON CONFLICT ({','.join(c.name for c in pk)}) DO NOTHING"
upsert = ' '.join((insert, ondup))
return upsert
答案 0 :(得分:0)
好的,这对我很有效
非常感谢@snakechrmerb
@compiles(Insert)
def _prefix_insert_with_ignore(insert_srt, compiler, **kw):
conn = Connection()
conn_str = conn.conn_str()
test_conn = conn_str.find("sqlite")
if test_conn == 0:
return compiler.visit_insert(insert_srt.prefix_with('OR IGNORE'), **kw)
else:
#if the connection is postgresql
ck = insert_srt.table.constraints
pk = insert_srt.table.primary_key
insert = compiler.visit_insert(insert_srt, **kw)
c = next(x for x in ck if isinstance(x, sa.UniqueConstraint))
column_names = [col.name for col in c.columns]
s= ", ".join(column_names)
ondup = f'ON CONFLICT ({s})DO NOTHING'
upsert = ' '.join((insert, ondup))
return upsert