Wat u in wezen doet, is de ORM omzeilen om de prestaties te optimaliseren. Wees daarom niet verbaasd dat u "het werk van de ORM nabootst", want dat is precies wat u moet doen.
Tenzij je veel plaatsen hebt waar je bulkupdates zoals deze moet doen, zou ik de benadering van magische gebeurtenissen afraden; gewoon het schrijven van de expliciete vragen is veel eenvoudiger.
Wat ik aanraad om te doen, is SQLAlchemy Core gebruiken in plaats van de ORM om de update uit te voeren:
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()