SQLAlchemy によるキャッシュの問題の解決
SQLAlchemy を使用してデータベースへのデータの挿入と取得を行う場合、キャッシュの問題が発生し、不整合が発生する可能性があります。この記事では、一般的な原因を調査し、SQLAlchemy でキャッシュを無効にする解決策を提供します。
SQLAlchemy キャッシュについて
SQLAlchemy は、各トランザクション内で ID マップを維持します。最近アクセスしたオブジェクトのキャッシュ。これにより、同じデータに対する複数のデータベース クエリが防止され、パフォーマンスが最適化されます。ただし、データが 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 はキャッシュされた古いレコード (John) の代わりに、更新されたユーザー レコード (Jane Doe) を返します。ドウ)。これにより、キャッシュの問題が解決され、アプリケーションがデータベースから常に最新のデータを取得できるようになります。
以上がデータの不整合を防ぐために SQLAlchemy キャッシュを無効にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。