ホームページ > データベース > mysql チュートリアル > SQLAlchemy で INSERT ... ON DUPLICATE KEY UPDATE を効率的に使用するにはどうすればよいですか?

SQLAlchemy で INSERT ... ON DUPLICATE KEY UPDATE を効率的に使用するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-24 10:31:11
オリジナル
337 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート