Elegant ON DUPLICATE KEY UPDATE mit SQLAlchemy
Frage: Gibt es eine nahtlose Möglichkeit, INSERT auszuführen ... ON DUPLICATE KEY UPDATE in SQLAlchemy mit einer ähnlichen Syntax wie inserter.insert().execute(list_of_dictionaries)?
Antwort:
Eingebaute Funktionalität für MySQL (ab Version 1.2)
Speziell für MySQL bietet SQLAlchemy jetzt Unterstützung für ON DUPLICATE KEY UPDATE.
ON DUPLICATE KEY UPDATE in SQL-Anweisungen
Um ON DUPLICATE KEY UPDATE explizit in das generierte SQL einzuschließen, können Sie den @compiles-Dekorator verwenden:
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
Dadurch können Sie die erforderliche Zeichenfolge an die generierte Einfügung anhängen Aussage:
my_connection.execute(my_table.insert(append_string='ON DUPLICATE KEY UPDATE foo=foo'), my_values)
ON DUPLICATE KEY UPDATE-Funktionalität im ORM
Obwohl SQLAlchemy keine explizite ORM-Unterstützung für ON DUPLICATE KEY UPDATE oder MERGE hat, verfügt es über die Sitzung .merge()-Funktion. Diese Funktion ist jedoch nur für Primärschlüssel wirksam.
Um die ON DUPLICATE KEY UPDATE-Funktionalität für Nicht-Primärschlüssel zu simulieren, können Sie eine Funktion wie die folgende implementieren:
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
Das obige ist der detaillierte Inhalt vonWie kann ich INSERT ... ON DUPLICATE KEY UPDATE mit SQLAlchemy effizient nutzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!