sql >> Databasteknik >  >> RDS >> Mysql

SQLAlchemy massuppdateringsstrategier

Vad du i huvudsak gör är att kringgå ORM för att optimera prestandan. Bli därför inte förvånad över att du "replikerar det arbete som ORM gör" för det är precis vad du behöver göra.

Om du inte har många ställen där du behöver göra massuppdateringar som denna, skulle jag rekommendera den magiska händelsemetoden; att bara skriva de explicita frågorna är mycket enklare.

Vad jag rekommenderar att göra är att använda SQLAlchemy Core istället för ORM för att göra uppdateringen:

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()


  1. Hur man får ForeignCollection Field till markören i Ormlite

  2. Hur återanvänder man en underfråga i sql?

  3. Skrivskyddat Oracle Home

  4. 🆕 SQL Server 2022 Första titt - Topp 5 nya funktioner (Bonus 5 funktioner)