web-dev-qa-db-ja.com

WHEREを使用したSQLAlchemy Coreの一括更新

SQLAlchemyの一括挿入を次のように処理できました。

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : '[email protected]'},
   {'user_id': 1, 'email_address' : '[email protected]'},
   {'user_id': 2, 'email_address' : '[email protected]'},
   {'user_id': 2, 'email_address' : '[email protected]'},
])

今必要なのは、アップデートに相当するものです。私はこれを試しました:

conn.execute(addresses.insert(), [ 
   {'user_id': 1, 'email_address' : '[email protected]', 'id':12},
   {'user_id': 1, 'email_address' : '[email protected]', 'id':13},
   {'user_id': 2, 'email_address' : '[email protected]', 'id':14},
   {'user_id': 2, 'email_address' : '[email protected]', 'id':15},
])

「id」フィールドに従って各行が更新されることを期待していますが、機能しません。 WHERE句を指定していないためと思われますが、辞書に含まれるデータを使用してWHERE句を指定する方法がわかりません。

誰か助けてくれますか?

22
jeanc

ドキュメントの 挿入、更新、削除 セクションをお読みください。次のコードで開始できます。

from sqlalchemy.sql.expression import bindparam
stmt = addresses.update().\
    where(addresses.c.id == bindparam('_id')).\
    values({
        'user_id': bindparam('user_id'),
        'email_address': bindparam('email_address'),
    })

conn.execute(stmt, [
    {'user_id': 1, 'email_address' : '[email protected]', '_id':1},
    {'user_id': 1, 'email_address' : '[email protected]', '_id':2},
    {'user_id': 2, 'email_address' : '[email protected]', '_id':3},
    {'user_id': 2, 'email_address' : '[email protected]', '_id':4},
])
51
van

Flask Sessionには、bulk_insert_mappingsおよびbulk_update_mappingsという関数があります。 こちら を確認してください。

マッピングで主キーを提供する必要があることに注意してください

# List of dictionary including primary key
user_mappings = [{
    'user_id': 1, # This is pk?
    'email_address': '[email protected]',
    '_id': 1
}, ...]

session.bulk_update_mappings(User, user_mappings)
session.commit()
11
Park Jong Bin