Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chiến lược cập nhật hàng loạt SQLAlchemy

Những gì bạn đang làm về cơ bản là bỏ qua ORM để tối ưu hóa hiệu suất. Do đó, đừng ngạc nhiên rằng bạn đang "tái tạo công việc mà ORM đang làm" vì đó chính xác là những gì bạn cần làm.

Trừ khi bạn có nhiều nơi cần cập nhật hàng loạt như thế này, tôi khuyên bạn không nên áp dụng cách tiếp cận sự kiện ma thuật; chỉ cần viết các truy vấn rõ ràng sẽ đơn giản hơn nhiều.

Điều tôi khuyên bạn nên làm là sử dụng SQLAlchemy Core thay vì ORM để cập nhật:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nhiều giá trị tìm kiếm trong php và mysql

  2. PHP / MySQL - Chọn một trong mỗi loại trong bảng

  3. mysql - dấu thời gian tìm kiếm theo giờ trong ngày

  4. Mã hóa với PHP Mcrypt và Giải mã với MySQL aes_decrypt?

  5. Tạo một truy vấn mysql động bằng cách sử dụng các biến php