Maison > base de données > tutoriel mysql > Comment puis-je utiliser efficacement INSERT... ON DUPLICATE KEY UPDATE avec SQLAlchemy ?

Comment puis-je utiliser efficacement INSERT... ON DUPLICATE KEY UPDATE avec SQLAlchemy ?

Mary-Kate Olsen
Libérer: 2024-11-24 10:31:11
original
338 Les gens l'ont consulté

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

Élégant SUR LA MISE À JOUR DE CLÉ EN DUPLICATE avec SQLAlchemy

Question : Existe-t-il un moyen transparent d'exécuter INSERT... SUR LA MISE À JOUR DE LA CLÉ EN DUPLICATE dans SQLAlchemy en utilisant une syntaxe similaire à inserter.insert().execute(list_of_dictionaries)?

Réponse :

Fonctionnalité intégrée pour MySQL (à partir de la version 1.2)

Pour MySQL en particulier, SQLAlchemy inclut désormais la prise en charge de ON DUPLICATE KEY UPDATE.

ON DUPLICATE KEY UPDATE dans les instructions SQL

Pour inclure explicitement ON DUPLICATE KEY UPDATE dans le SQL généré, vous pouvez utiliser le décorateur @compiles :

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

Cela vous permet d'ajouter la chaîne nécessaire à l'insert généré déclaration :

my_connection.execute(my_table.insert(append_string='ON DUPLICATE KEY UPDATE foo=foo'), my_values)
Copier après la connexion

ON DUPLICATE KEY UPDATE Fonctionnalité dans l'ORM

Bien que SQLAlchemy ne prenne pas en charge explicitement l'ORM pour ON DUPLICATE KEY UPDATE ou MERGE, il a la session Fonction .merge(). Cependant, cette fonction n'est efficace que pour les clés primaires.

Pour simuler la fonctionnalité ON DUPLICATE KEY UPDATE pour les clés non primaires, vous pouvez implémenter une fonction comme la suivante :

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
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