12月10, 2020

SQLAlchemy批量更新 

你实质上是在绕过ORM来优化性能。因此,不要惊讶于“复制ORM正在做的工作”,因为这正是您需要做的。 

除非你有很多地方需要做这样的批量更新,否则我会建议不要使用神奇事件方法;简单地写明确的查询要简单得多。 我的建议是使用SQLAlchemy的核心,而不是ORM做更新做:

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

本文链接:http://57km.cc/post/SQLAlchemy-batch-update.html

-- EOF --

Comments