Sqlalalchemy Postgresql插入语句忽略重复项

时间:2019-08-30 10:26:12

标签: python postgresql sqlalchemy

我正在尝试使用SQLAlchemy将数据批量插入到postgres中,但是无法找出如何说它通过唯一约束忽略重复值

我的代码

from sqlalchemy.dialects.postgresql import insert

stmt = insert(User, inline=True)

values = [{"id": 1, "name": "David"}, {"id": 2, "name": "Cris"}]

session.execute(stmt, values)
session.commit()

遇到这样的错误

  

sqlalchemy.exc.IntegrityError:(psycopg2.IntegrityError)重复键值违反了唯一约束“ uq_users_name”

1 个答案:

答案 0 :(得分:3)

默认情况下sqlalchemy不支持ignore_duplicates选项,因此我们需要通过在查询末尾添加ON CONFLICT DO NOTHING字符串来向sqlalchemy查询编译器添加自定义方法

from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.ext.compiler import compiles

@compiles(Insert, 'postgresql')
def ignore_duplicates(insert, compiler, **kw):
    s = compiler.visit_insert(insert, **kw)
    ignore = insert.kwargs.get('postgresql_ignore_duplicates', False)
    return s if not ignore else s + ' ON CONFLICT DO NOTHING'

Insert.argument_for('postgresql', 'ignore_duplicates', None)


stmt = insert(User, postgresql_ignore_duplicates=True, inline=True)

values = [{"id": 1, "name": "David"}, {"id": 2, "name": "Cris"}]

session.execute(stmt, values)
session.commit()