Apa yang Anda lakukan pada dasarnya adalah melewati ORM untuk mengoptimalkan kinerja. Oleh karena itu, jangan kaget bahwa Anda "meniru pekerjaan yang dilakukan ORM" karena memang itulah yang perlu Anda lakukan.
Kecuali Anda memiliki banyak tempat di mana Anda perlu melakukan pembaruan massal seperti ini, saya akan merekomendasikan pendekatan acara magis; hanya menulis kueri eksplisit jauh lebih mudah.
Apa yang saya sarankan lakukan adalah menggunakan SQLAlchemy Core alih-alih ORM untuk melakukan pembaruan:
ledger = Table("ledger", db.metadata,
Column("wallet_id", Integer, primary_key=True),
Column("new_balance", Float),
prefixes=["TEMPORARY"],
)
wallets = db_session.query(Wallet).all()
# figure out new balances
balance_map = {}
for w in wallets:
balance_map[w.id] = calculate_new_balance(w)
# create temp table with balances we need to update
ledger.create(bind=db.session.get_bind())
# insert update data
db.session.execute(ledger.insert().values([{"wallet_id": k, "new_balance": v}
for k, v in balance_map.items()])
# perform update
db.session.execute(Wallet.__table__
.update()
.values(balance=ledger.c.new_balance)
.where(Wallet.__table__.c.id == ledger.c.wallet_id))
# drop temp table
ledger.drop(bind=db.session.get_bind())
# commit changes
db.session.commit()