Maison  >  Article  >  base de données  >  Comment puis-je obtenir la fonctionnalité INSERT... ON DUPLICATE KEY UPDATE dans SQLAlchemy ?

Comment puis-je obtenir la fonctionnalité INSERT... ON DUPLICATE KEY UPDATE dans SQLAlchemy ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-23 21:21:12160parcourir

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

Elegant ON DUPLICATE KEY UPDATE dans SQLAlchemy

SQLAlchemy ne dispose pas d'une solution transparente pour effectuer les opérations "INSERT ... ON DUPLICATE KEY UPDATE" à l'aide sa couche ORM. Cependant, il existe des solutions de contournement pour obtenir des fonctionnalités similaires.

Support MySQL intégré

Pour les bases de données MySQL, SQLAlchemy fournit désormais un support intégré pour ON DUPLICATE KEY UPDATE. Ceci peut être réalisé en utilisant la syntaxe suivante :

inserter = my_table.insert()
inserter.execute(list_of_dictionaries)

Paramétré ON DUPLICATE KEY UPDATE

Pour inclure une clause ON DUPLICATE KEY UPDATE dans l'instruction SQL générée pour d'autres bases de données, vous pouvez utiliser un décorateur pour ajouter le fichier souhaité 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)

Fonctionnalité ORM pour les clés primaires

Pour les objets ORM où la clé unique est une clé primaire, la fonction session.merge() de SQLAlchemy peut être utilisée pour répliquer la fonctionnalité ON DUPLICATE KEY UPDATE :

session.merge(ModelObject)

Implémentation personnalisée pour Clés non primaires

Pour les contraintes uniques de clé non primaire, une fonction personnalisée ressemblant à get_or_create() de Django peut être créée pour obtenir le comportement souhaité :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn