SQLAlchemy INSERT IGNORE

时间:2010-02-07 20:54:54

标签: python insert sqlalchemy ignore

如何在表中插入多个数据记录而忽略重复项。我正在使用SQLAlchemy。

谢谢!

2 个答案:

答案 0 :(得分:26)

prefix_with("TEXT")INSERT和SQL的其余部分之间添加任意文本。如果您只想插入单个记录,execute()会接受包含您要插入的记录的词典列表或单个词典。

您正在寻找的行为的SQLite语法:

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

答案 1 :(得分:0)

要始终将INSERT替换为INSERT OR IGNORE,可以使用compiler extension

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调用之前正确完成所有操作,就可以了。