sql >> Database >  >> RDS >> Mysql

SQLAlchemy-strategieën voor bulkupdates

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


  1. Wat is de meest elegante manier om een ​​tijdstempel met nanosec op te slaan in postgresql?

  2. Hoe gebruik je order by in Laravel wanneer het CASE WHEN gebruikt?

  3. Lopend totaal berekenen met OVER-clausule en PARTITION BY-clausule in SQL Server

  4. Hoe wireshark te gebruiken om mysql-query sql duidelijk vast te leggen?