Résoudre les problèmes de mise en cache avec SQLAlchemy
Lors de l'utilisation de SQLAlchemy pour insérer et récupérer des données d'une base de données, des problèmes de mise en cache peuvent survenir, entraînant des incohérences. Cet article étudie les causes courantes et propose une solution pour désactiver la mise en cache dans SQLAlchemy.
Comprendre la mise en cache de SQLAlchemy
SQLAlchemy maintient une carte d'identité au sein de chaque transaction, qui agit comme un cache pour les objets récemment consultés. Cela optimise les performances en empêchant plusieurs requêtes de base de données pour les mêmes données. Cependant, lorsque les données sont mises à jour en externe vers SQLAlchemy, ce cache peut provoquer des problèmes en renvoyant des résultats obsolètes.
Désactivation de la mise en cache
Pour résoudre ce problème, il est nécessaire de désactiver mise en cache dans SQLAlchemy. Ceci peut être réalisé en définissant l'indicateur expire_on_commit sur True dans la configuration du mappeur. Le code suivant montre comment procéder :
# 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 }
En définissant expire_on_commit sur True, SQLAlchemy fera expirer tous les objets de la carte d'identité lors de la validation. Cela garantit que les données les plus récentes sont toujours récupérées de la base de données.
Exemple
Considérez le scénario décrit dans la question d'origine :
# 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>
Avec la mise en cache désactivée, SQLAlchemy renverra l'enregistrement utilisateur mis à jour (Jane Doe) au lieu de l'enregistrement mis en cache obsolète (John Doe). Cela résout le problème de mise en cache et garantit que l'application récupère toujours les dernières données de la base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!