Det, du i bund og grund gør, er at omgå ORM'en for at optimere ydeevnen. Derfor skal du ikke blive overrasket over, at du "gentager det arbejde, som ORM udfører", for det er præcis, hvad du skal gøre.
Medmindre du har mange steder, hvor du skal lave masseopdateringer som denne, vil jeg anbefale den magiske begivenhedstilgang; blot at skrive de eksplicitte forespørgsler er meget mere ligetil.
Det, jeg anbefaler at gøre, er at bruge SQLAlchemy Core i stedet for ORM til at lave opdateringen:
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()