使用 SQLAlchemy 解決快取問題
使用 SQLAlchemy 從資料庫插入和檢索資料時,可能會出現快取問題,從而導致不一致。本文研究了常見原因並提供了在 SQLAlchemy 中停用快取的解決方案。
了解 SQLAlchemy 快取
SQLAlchemy 在每個事務中維護一個識別映射,該映射充當快取最近存取的物件。這樣可以防止對相同資料進行多個資料庫查詢,從而優化效能。但是,當資料從外部更新到 SQLAlchemy 時,此快取可能會因傳回過時的結果而導致問題。
停用快取
要解決此問題,有必要停用SQLAlchemy 中的快取。這可以透過在映射器配置上將 expire_on_commit 標誌設為 True 來實現。以下程式碼示範如何執行此操作:
# Import the ORM classes from sqlalchemy import Column, Integer, String, create_engine, sessionmaker # Create an engine and session factory engine = create_engine('mysql+pymysql://username:password@host/database') Session = sessionmaker(bind=engine) # Define the User class class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) __mapper_args__ = { 'expire_on_commit': True }
透過將expire_on_commit 設定為True,SQLAlchemy 將在提交時使身分映射中的所有物件過期。這可確保始終從資料庫中檢索最新資料。
範例
考慮原始問題中所描述的場景:
# Create a session session = Session() # Insert data into the database new_user = User(name='John Doe') session.add(new_user) session.commit() # Update the data directly in the database connection = engine.connect() cursor = connection.cursor() cursor.execute("UPDATE users SET name='Jane Doe' WHERE>
停用快取後,SQLAlchemy 將傳回更新的使用者記錄(Jane Doee ),而不是過時的快取記錄(John美國能源部)。這解決了快取問題並確保應用程式始終從資料庫中檢索最新資料。
以上是如何停用 SQLAlchemy 快取以防止資料不一致?的詳細內容。更多資訊請關注PHP中文網其他相關文章!