SQLAlchemy を使用したエレガントな ON DUPLICATE KEY UPDATE
質問: INSERT ... を実行するシームレスな方法はありますか? SQLAlchemy で次のような構文を使用した ON DUPLICATE KEY UPDATE inserter.insert().execute(list_of_dictionaries)?
答え:
MySQL の組み込み機能 (バージョン 1.2 以降)
特に MySQL の場合、SQLAlchemy に ON のサポートが含まれるようになりました。 DUPLICATE KEY UPDATE.
SQL ステートメント内の ON DUPLICATE KEY UPDATE
生成された SQL に ON DUPLICATE KEY UPDATE を明示的に含めるには、@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
これにより、必要な文字列を追加できます生成された挿入ステートメント:
my_connection.execute(my_table.insert(append_string='ON DUPLICATE KEY UPDATE foo=foo'), my_values)
ORM の ON DUPLICATE KEY UPDATE 機能
SQLAlchemy には ON DUPLICATE KEY UPDATE または MERGE に対する明示的な ORM サポートがありませんが、サポートされています。 session.merge() 関数があります。ただし、この関数は主キーに対してのみ有効です。
主キー以外の ON DUPLICATE KEY UPDATE 機能をシミュレートするには、次のような関数を実装できます:
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
以上がSQLAlchemy で INSERT ... ON DUPLICATE KEY UPDATE を効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。