关于 postgresql 冲突的 Sqlalchemy upsert

时间:2021-05-15 19:05:54

标签: database postgresql sqlalchemy bulkinsert upsert

在 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

1 个答案:

答案 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
相关问题