Question

J'ai une classe de référentiel qui renvoie les données d'une base de données SQLite. Voici un exemple de base:

class FeedbackRepository:
    def __init__(self):
        self.connection = sqlite3.connect('feedback.db')
        self.cursor = self.connection.cursor()
        self.setupDatabase()

    def setupDatabase(self):
        sql = """
                  CREATE TABLE IF NOT EXISTS FeedbackEntries
                  (
                      id TEXT NOT NULL,
                      rep TEXT,
                      rating TEXT NOT NULL
                  )
              """
        self.cursor.execute(sql)
        self.connection.commit()

    def getAllFeedback(self):
        sql = """SELECT * FROM FeedbackEntries"""
        self.cursor.execute(sql)
        data = self.cursor.fetchall()
        return [self._getFeedbackEntryModelFromRow(row) for row in data]

Je crée une instance de cette classe dans deux .py fichiers, et chaque fois que j'appelle getAllFeedback(). Dans un fichier, tous les commentaires sont renvoyés à partir de la requête de base de données. Le deuxième fichier, renvoie une collection vide du cursor.fetchall(). Le code des deux fichiers ne s'exécute pas simultanément, j'exécute les scripts au moment séparé, et il ne devrait donc jamais y avoir plus d'une connexion à tout moment (si cela fait même une différence).

Je ne sais pas comment cela pourrait se produire, d'autant plus que les deux scripts utilisent le même code?

Était-ce utile?

La solution

Vous utilisez un chemin relatif dans le sqlite3.connect() appel; Cela signifie que l'emplacement exact du fichier de base de données dépend du répertoire de travail actuel. Si vous exécutez le script à partir d'un emplacement différent, le fichier de base de données sera recréé.

Utilisez plutôt un chemin absolu; Vous pouvez le baser de l'emplacement du module avec:

import os

_module_directory = os.path.dirname(os.path.abspath(__file__))

alors:

self.connection = sqlite3.connect(os.path.join(_module_directory, 'feedback.db'))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top