Запрос SQLite возвращает разные результаты из разных классов

StackOverflow https://stackoverflow.com/questions/20353964

  •  25-08-2022
  •  | 
  •  

Вопрос

У меня есть класс репозитория, который возвращает данные из базы данных SQLite. Вот основной пример:

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]

Я создаю экземпляр этого класса в двух разных .py файлы и каждый раз, когда я звоню getAllFeedback(). Анкет В одном файле все отзывы возвращаются из запроса базы данных. Второй файл возвращает пустую коллекцию из cursor.fetchall(). Анкет Код из двух файлов не работает одновременно, я запускаю сценарии в отдельное время, и поэтому никогда не должно быть более одного соединения в любое время (если это даже имеет значение).

Я понятия не имею, как это может произойти, особенно когда оба сценария используют один и тот же код?

Это было полезно?

Решение

Вы используете относительный путь в sqlite3.connect() вызов; Это означает, что точное местоположение файла базы данных зависит от текущего рабочего каталога. Если вы выполните сценарий из другого места, файл базы данных будет воссоздан.

Вместо этого используйте абсолютный путь; Вы можете основать его в расположении модуля с помощью:

import os

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

тогда:

self.connection = sqlite3.connect(os.path.join(_module_directory, 'feedback.db'))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top