É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
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)
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
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!