SQLAlchemy 中的优雅 ON DUPLICATE KEY UPDATE
SQLAlchemy 缺乏使用以下命令执行“INSERT ... ON DUPLICATE KEY UPDATE”操作的无缝解决方案它的 ORM 层。但是,有一些解决方法可以实现类似的功能。
内置 MySQL 支持
对于 MySQL 数据库,SQLAlchemy 现在提供对 ON DUPLICATE KEY UPDATE 的内置支持。这可以使用以下语法来实现:
inserter = my_table.insert() inserter.execute(list_of_dictionaries)
参数化 ON DUPLICATE KEY UPDATE
在为其他对象生成的 SQL 语句中包含 ON DUPLICATE KEY UPDATE 子句数据库,您可以使用装饰器来附加所需的string:
@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 my_connection.execute(my_table.insert(append_string = 'ON DUPLICATE KEY UPDATE foo=foo'), my_values)
主键的 ORM 功能
对于唯一键为主键的 ORM 对象,可以使用 SQLAlchemy 的 session.merge() 函数复制重复密钥更新功能:
session.merge(ModelObject)
非主键的自定义实现
对于非主键唯一约束,可以创建一个类似于 Django 的 get_or_create() 的自定义函数来实现期望的行为:
def get_or_create(session, model, defaults=None, **kwargs): instance = session.query(model).filter_by(**kwargs).first() if instance: return instance else: params = {k: v for k, v in kwargs.items() if not isinstance(v, ClauseElement)} if defaults: params.update(defaults) instance = model(**params) return instance
以上是如何在 SQLAlchemy 中实现 INSERT ... ON DUPLICATE KEY UPDATE 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!