Elegant ON DUPLICATE KEY UPDATE in SQLAlchemy
SQLAlchemy fehlt eine nahtlose Lösung für die Durchführung von „INSERT ... ON DUPLICATE KEY UPDATE“-Vorgängen mit seine ORM-Schicht. Es gibt jedoch Problemumgehungen, um eine ähnliche Funktionalität zu erreichen.
Integrierte MySQL-Unterstützung
Für MySQL-Datenbanken bietet SQLAlchemy jetzt integrierte Unterstützung für ON DUPLICATE KEY UPDATE. Dies kann mit der folgenden Syntax erreicht werden:
inserter = my_table.insert() inserter.execute(list_of_dictionaries)
Parameterized ON DUPLICATE KEY UPDATE
Um eine ON DUPLICATE KEY UPDATE-Klausel in die generierte SQL-Anweisung für andere aufzunehmen Datenbanken können Sie einen Dekorator verwenden, um die gewünschte Zeichenfolge anzuhängen:
@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 Funktionalität für Primärschlüssel
Für ORM-Objekte, bei denen der eindeutige Schlüssel ein Primärschlüssel ist, kann die session.merge()-Funktion von SQLAlchemy verwendet werden, um die ON DUPLICATE KEY UPDATE-Funktionalität zu replizieren:
session.merge(ModelObject)
Benutzerdefinierte Implementierung für Nicht-Primärschlüssel
Für Nicht-Primärschlüssel eindeutig Einschränkungen kann eine benutzerdefinierte Funktion, die Djangos get_or_create() ähnelt, erstellt werden, um das gewünschte Verhalten zu erreichen:
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
Das obige ist der detaillierte Inhalt vonWie kann ich die INSERT ... ON DUPLICATE KEY UPDATE-Funktionalität in SQLAlchemy erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!