SQLAlchemy のエレガントな ON DUPLICATE KEY UPDATE
SQLAlchemy には、次を使用して「INSERT ... ON DUPLICATE KEY UPDATE」操作を実行するためのシームレスなソリューションがありません。その ORM 層。ただし、同様の機能を実現するための回避策があります。
組み込み MySQL サポート
MySQL データベースの場合、SQLAlchemy は ON DUPLICATE KEY UPDATE の組み込みサポートを提供するようになりました。これは、次の構文を使用して実現できます。
inserter = my_table.insert() inserter.execute(list_of_dictionaries)
パラメータ化された ON DUPLICATE KEY UPDATE
他の目的で生成された SQL ステートメントに ON DUPLICATE KEY UPDATE 句を含めるにはデータベースでは、デコレータを使用して必要なデータを追加できます。 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)
主キーの ORM 機能
一意のキーが主キーである ORM オブジェクトの場合、SQLAlchemy の session.merge() 関数を利用できます。 ON DUPLICATE KEY UPDATE を複製する機能:
session.merge(ModelObject)
非主キーのカスタム実装
非主キーの一意制約の場合、Django の get_or_create() に似たカスタム関数を作成して、望ましい動作を達成する:
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
以上がSQLAlchemy で INSERT ... ON DUPLICATE KEY UPDATE 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。