SQLAlchemy 插入忽略
我想知道怎么在使用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'}])