SQLAlchemy 插入忽略

32 投票
2 回答
19407 浏览
提问于 2025-04-15 19:00

我想知道怎么在使用SQLAlchemy的时候,把多条数据记录插入到表里,并且忽略重复的数据。谢谢!

2 个回答

3

如果你想把所有的 INSERT 替换成 INSERT OR IGNORE,可以使用一个叫做 编译器扩展 的东西:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert

@compiles(Insert)
def _prefix_insert_with_ignore(insert, compiler, **kw):
    return compiler.visit_insert(insert.prefix_with('OR IGNORE'), **kw)

如果你只想临时这样做,可以手动调用 compiles 装饰器,完成后再用 deregister 来取消这个设置:

from sqlalchemy.ext.compiler import compiles, deregister
from sqlalchemy.sql.expression import Insert

def _prefix_insert_with_ignore(insert, compiler, **kw):
    return compiler.visit_insert(insert.prefix_with('OR IGNORE'), **kw)

compiles(Insert)(_prefix_insert_with_replace)
try:
    # do some inserts...
finally:
    deregister(Insert)

这样做可能有点不太正规,因为它还是全局生效的。不过,只要你不使用线程,并确保在调用 deregister 之前,所有的操作都已经正确提交,那这样做应该是没问题的。

37

prefix_with("TEXT") 这个功能可以在 INSERT 和后面的 SQL 语句之间添加任意文本。execute() 方法可以接收一个字典列表,这些字典里包含你想要插入的记录。如果你只想插入一条记录,也可以只用一个字典。

下面是你想要的行为的 SQLite 语法:

inserter = table_object.insert().prefix_with("OR REPLACE")
inserter.execute([{'column1':'value1'}, {'column1':'value2'}])

撰写回答