Heim  >  Artikel  >  Datenbank  >  Wie kann ich die INSERT ... ON DUPLICATE KEY UPDATE-Funktionalität in SQLAlchemy erreichen?

Wie kann ich die INSERT ... ON DUPLICATE KEY UPDATE-Funktionalität in SQLAlchemy erreichen?

Susan Sarandon
Susan SarandonOriginal
2024-11-23 21:21:12156Durchsuche

How Can I Achieve INSERT ... ON DUPLICATE KEY UPDATE Functionality in SQLAlchemy?

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!

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