Maison > Article > base de données > Comment puis-je obtenir la fonctionnalité INSERT... ON DUPLICATE KEY UPDATE dans 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!