Pergunta

Eu tenho uma classe de repositório que retorna dados de um banco de dados SQLite. Aqui está um exemplo básico:

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]

Estou criando uma instância desta classe em dois diferentes .py arquivos, e cada vez que eu ligo getAllFeedback(). Em um arquivo, todo o feedback é retornado da consulta do banco de dados. O segundo arquivo, retorna uma coleção vazia do cursor.fetchall(). O código dos dois arquivos não é executado simultaneamente, eu executo os scripts em horário separado e, portanto, nunca deve haver mais de uma conexão a qualquer momento (se isso faz a diferença).

Não tenho ideia de como isso pode acontecer, especialmente porque os dois scripts estão usando o mesmo código?

Foi útil?

Solução

Você está usando um caminho relativo no sqlite3.connect() ligar; Isso significa que a localização exata do arquivo de banco de dados depende do diretório de trabalho atual. Se você executar o script de um local diferente, o arquivo de banco de dados será recriado.

Use um caminho absoluto; Você pode baseá -lo na localização do módulo com:

import os

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

então:

self.connection = sqlite3.connect(os.path.join(_module_directory, 'feedback.db'))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top