使用 SQLAlchemy 进行优雅的重复键更新
问题:有没有一种无缝的方法来执行 INSERT ... SQLAlchemy 中的 ON DUPLICATE KEY UPDATE 使用类似于以下的语法inserter.insert().execute(list_of_dictionaries)?
答案:
MySQL 内置功能(自版本 1.2 起)
特别是对于 MySQL,SQLAlchemy 现在包含对 ON 的支持DUPLICATE KEY UPDATE。
SQL 语句中的 ON DUPLICATE KEY UPDATE
要在生成的 SQL 中显式包含 ON DUPLICATE KEY UPDATE,您可以使用 @compiles 装饰器:
from sqlalchemy.ext.compiler import compiles from sqlalchemy.sql.expression import Insert @compiles(Insert) def append_string(insert, compiler, **kw): s = compiler.visit_insert(insert, **kw) if 'append_string' in insert.kwargs: return s + " " + insert.kwargs['append_string'] return s
这允许您将必要的字符串附加到生成的insert 语句:
my_connection.execute(my_table.insert(append_string='ON DUPLICATE KEY UPDATE foo=foo'), my_values)
ORM 中的 ON DUPLICATE KEY UPDATE 功能
虽然 SQLAlchemy 缺乏对 ON DUPLICATE KEY UPDATE 或 MERGE 的显式 ORM 支持,但它确实具有session.merge() 函数。不过,该函数仅对主键有效。
要模拟非主键的 ON DUPLICATE KEY UPDATE 功能,可以实现如下函数:
def get_or_create(session, model, defaults=None, **kwargs): instance = session.query(model).filter_by(**kwargs).first() if instance: return instance else: params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement)) if defaults: params.update(defaults) instance = model(**params) return instance
以上是如何通过 SQLAlchemy 有效地使用 INSERT ... ON DUPLICATE KEY UPDATE?的详细内容。更多信息请关注PHP中文网其他相关文章!