SQLAlchemy로 캐싱 문제 해결
SQLAlchemy를 사용하여 데이터베이스에 데이터를 삽입하고 검색할 때 캐싱 문제가 발생하여 불일치가 발생할 수 있습니다. 이 문서에서는 일반적인 원인을 조사하고 SQLAlchemy에서 캐싱을 비활성화하는 솔루션을 제공합니다.
SQLAlchemy 캐싱 이해
SQLAlchemy는 각 트랜잭션 내에서 ID 맵을 유지 관리합니다. 최근에 액세스한 개체에 대한 캐시입니다. 이는 동일한 데이터에 대한 여러 데이터베이스 쿼리를 방지하여 성능을 최적화합니다. 그러나 SQLAlchemy 외부에서 데이터가 업데이트되면 이 캐시는 오래된 결과를 반환하여 문제를 일으킬 수 있습니다.
캐싱 비활성화
이 문제를 해결하려면 비활성화해야 합니다. SQLAlchemy에서 캐싱. 이는 매퍼 구성에서 만료_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 }
expired_on_commit를 True로 설정하면 SQLAlchemy는 커밋 시 ID 맵의 모든 개체를 만료시킵니다. 이렇게 하면 데이터베이스에서 항상 최신 데이터를 검색할 수 있습니다.
예
원래 질문에 설명된 시나리오를 고려하세요.
# 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!