Heim  >  Artikel  >  Datenbank  >  Wie kann ich INSERT ... ON DUPLICATE KEY UPDATE mit SQLAlchemy effizient nutzen?

Wie kann ich INSERT ... ON DUPLICATE KEY UPDATE mit SQLAlchemy effizient nutzen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-24 10:31:11308Durchsuche

How Can I Efficiently Use INSERT ... ON DUPLICATE KEY UPDATE with SQLAlchemy?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn