प्रदर्शन को अनुकूलित करने के लिए आप जो अनिवार्य रूप से कर रहे हैं वह ओआरएम को छोड़कर है। इसलिए, आश्चर्यचकित न हों कि आप "ओआरएम द्वारा किए जा रहे कार्य को दोहरा रहे हैं" क्योंकि ठीक यही आपको करने की आवश्यकता है।
जब तक आपके पास बहुत सारे स्थान नहीं हैं जहां आपको इस तरह के थोक अपडेट करने की आवश्यकता है, मैं जादुई घटना दृष्टिकोण के खिलाफ अनुशंसा करता हूं; केवल स्पष्ट प्रश्नों को लिखना अधिक सरल है।
मैं जो करने की सलाह देता हूं वह अद्यतन करने के लिए ORM के बजाय SQLAlchemy Core का उपयोग कर रहा है:
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()