Maison > base de données > tutoriel mysql > 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
Libérer: 2024-11-23 21:21:12
original
249 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal