Код Flask SQLalchemy не «видит» записи базы данных после повторного запуска кода

Я создал небольшую базу данных с одной таблицей и заполнил ее данными. Это сработало отлично. Однако после того, как я вышел из VSCode и зашел снова, код распознает БД и делает запросы, но в результате получает пустой список (как будто он не «видит» записи БД). БД заполнена данными; Я вижу это в браузере БД. Более того, код в другом файле, который импортирует модель БД из первого, успешно получает правильные данные. Что может быть не так с первым файлом? Первый файл (app.py):

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # I tried also True

with app.app_context():
    db = SQLAlchemy(app)

    class Recipy(db.Model):
        id = db.Column(db.Integer, primary_key = True) 
        title = db.Column(db.String(100), index = True, unique = True) 
        …
    db.create_all()
    
@app.route('/')
def index():
    rows=Recipy.query.all()
    print(rows) # it is just to have results on terminal; results are an empty list [] both here and on the html-page
    return render_template("home.html", rows=rows, search_form=search_form)
…
if __name__ == '__main__':
    app.run()

>>> []

Второй файл, который успешно получает данные:

from app import app, db, Recipy
with app.app_context():
    a=Recipy.query.get(2)
    rows=Recipy.query.order_by(Recipy.title).all()
    print(a, rows)

>>> <Recipy 2> [<Recipy 1>, <Recipy 2>, …]

Оба файла находятся в одной папке. Оба раза я запускаю его в одном и том же venv. Буду очень благодарен за подсказку.

Я попробовал app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True Я также пробовал аналогичные фрагменты кода, созданные в другой папке с другой базой данных (которая включала две таблицы), но результаты были такими же.

Обновлено: В соответствии с комментарием я добавил app.config["SQLALCHEMY_ECHO"] = "debug". Вывод терминала следующий: Для первой функции:

023-01-10 17:23:27,458 DEBUG sqlalchemy.pool.impl.NullPool Created new connection <sqlite3.Connection object at 0x00000268DFA0DB40>
2023-01-10 17:23:27,459 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000268DFA0DB40> checked out from pool
2023-01-10 17:23:27,460 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-01-10 17:23:27,467 INFO sqlalchemy.engine.Engine SELECT recipy.id AS recipy_id, recipy.title AS recipy_title, recipy.author AS recipy_author, recipy.ingredients AS recipy_ingredients, recipy.instructions AS recipy_instructions     
FROM recipy
2023-01-10 17:23:27,468 INFO sqlalchemy.engine.Engine [generated in 0.00207s] ()
2023-01-10 17:23:27,470 DEBUG sqlalchemy.engine.Engine Col ('recipy_id', 'recipy_title', 'recipy_author', 'recipy_ingredients', 'recipy_instructions')
[]
2023-01-10 17:23:27,491 INFO sqlalchemy.engine.Engine ROLLBACK
2023-01-10 17:23:27,494 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000268DFA0DB40> being returned to pool
2023-01-10 17:23:27,501 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000268DFA0DB40> rollback-on-return
2023-01-10 17:23:27,504 DEBUG sqlalchemy.pool.impl.NullPool Closing connection <sqlite3.Connection object at 0x00000268DFA0DB40>

Для функции, которая возвращает результаты:

2023-01-10 18:15:46,205 DEBUG sqlalchemy.pool.impl.NullPool Created new connection <sqlite3.Connection object at 0x00000286178E9B40>
2023-01-10 18:15:46,205 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9B40> checked out from pool
2023-01-10 18:15:46,216 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-01-10 18:15:46,217 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("recipy")
2023-01-10 18:15:46,218 INFO sqlalchemy.engine.Engine [raw sql] ()
2023-01-10 18:15:46,219 DEBUG sqlalchemy.engine.Engine Col ('cid', 'name', 'type', 'notnull', 'dflt_value', 'pk')     
2023-01-10 18:15:46,220 DEBUG sqlalchemy.engine.Engine Row (0, 'id', 'INTEGER', 1, None, 1)
2023-01-10 18:15:46,220 DEBUG sqlalchemy.engine.Engine Row (1, 'title', 'VARCHAR(100)', 0, None, 0)
2023-01-10 18:15:46,221 DEBUG sqlalchemy.engine.Engine Row (2, 'author', 'VARCHAR(40)', 0, None, 0)
2023-01-10 18:15:46,222 DEBUG sqlalchemy.engine.Engine Row (3, 'ingredients', 'VARCHAR(500)', 0, None, 0)
2023-01-10 18:15:46,223 DEBUG sqlalchemy.engine.Engine Row (4, 'instructions', 'VARCHAR(4000)', 0, None, 0)
2023-01-10 18:15:46,224 INFO sqlalchemy.engine.Engine COMMIT
2023-01-10 18:15:46,226 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9B40> being returned to pool
2023-01-10 18:15:46,227 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9B40> rollback-on-return
2023-01-10 18:15:46,230 DEBUG sqlalchemy.pool.impl.NullPool Closing connection <sqlite3.Connection object at 0x00000286178E9B40>
2023-01-10 18:15:46,239 DEBUG sqlalchemy.pool.impl.NullPool Created new connection <sqlite3.Connection object at 0x00000286178E9940>
2023-01-10 18:15:46,240 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9940> checked out from pool
2023-01-10 18:15:46,241 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-01-10 18:15:46,245 INFO sqlalchemy.engine.Engine SELECT recipy.id AS recipy_id, recipy.title AS recipy_title, recipy.author AS recipy_author, recipy.ingredients AS recipy_ingredients, recipy.instructions AS recipy_instructions     
FROM recipy
WHERE recipy.id = ?
2023-01-10 18:15:46,246 INFO sqlalchemy.engine.Engine [generated in 0.00101s] (2,)
2023-01-10 18:15:46,248 DEBUG sqlalchemy.engine.Engine Col ('recipy_id', 'recipy_title', 'recipy_author', 'recipy_ingredients', 'recipy_instructions')
2023-01-10 18:15:46,249 DEBUG sqlalchemy.engine.Engine Row (2, 'Omelet', 'Serge', '2 eggs,\nmilk, \r\nolive oil', 'Mix it and fry on the pan')
2023-01-10 18:15:46,253 INFO sqlalchemy.engine.Engine SELECT recipy.id AS recipy_id, recipy.title AS recipy_title, recipy.author AS recipy_author, recipy.ingredients AS recipy_ingredients, recipy.instructions AS recipy_instructions     
FROM recipy ORDER BY recipy.title
2023-01-10 18:15:46,254 INFO sqlalchemy.engine.Engine [generated in 0.00130s] ()
2023-01-10 18:15:46,255 DEBUG sqlalchemy.engine.Engine Col ('recipy_id', 'recipy_title', 'recipy_author', 'recipy_ingredients', 'recipy_instructions')
2023-01-10 18:15:46,256 DEBUG sqlalchemy.engine.Engine Row (1, 'Baked apple', 'Serge', 'apple', 'Just bake it')       
2023-01-10 18:15:46,256 DEBUG sqlalchemy.engine.Engine Row (2, 'Omelet', 'Serge', '2 eggs,\nmilk, \r\nolive oil', 'Mix it and fry on the pan')
… (10 more similar rows with the content)
<Recipy 2> [<Recipy 1>, <Recipy 2>, <Recipy 4>, <Recipy 10>, <Recipy 12>, <Recipy 14>, <Recipy 13>, <Recipy 9>, <Recipy 8>, <Recipy 7>, <Recipy 5>]
2023-01-10 18:15:46,268 INFO sqlalchemy.engine.Engine ROLLBACK
2023-01-10 18:15:46,269 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9940> being returned to pool
2023-01-10 18:15:46,269 DEBUG sqlalchemy.pool.impl.NullPool Connection <sqlite3.Connection object at 0x00000286178E9940> rollback-on-return
2023-01-10 18:15:46,270 DEBUG sqlalchemy.pool.impl.NullPool Closing connection <sqlite3.Connection object at 0x00000286178E9940>

Пожалуйста, установите app.config["SQLALCHEMY_ECHO"] = "debug" и отредактируйте свой вопрос, чтобы добавить вывод терминала при запуске вашего маршрута.

ljmc 11.01.2023 00:03

Да, пожалуйста, я сделал это.

Sergii 11.01.2023 00:30

Можете ли вы сделать то же самое для функции, которая возвращает результаты?

ljmc 11.01.2023 00:33

Да, извините, что не сделал этого сразу.

Sergii 11.01.2023 01:22

Вы написали, что dbURI — это 'sqlite:///myDB.db', который зависит от os.getcwd(). Вы уверены, что файл, используемый веб-приложением, идентичен тому, в котором выполняется интерактивный .query.get(2)? Вы регистрируете CWD? Может быть, запишите размер этого файла, затем ВСТАВЬТЕ сто строк и повторно изучите размер?

J_H 11.01.2023 01:44

@J_H Ты прав. Моя ошибка заключалась в том, что при втором запуске кода я находился в другом каталоге (согласно командной строке VSCode), поэтому новый файл myDB.db был создан в другом месте. (Я не могу понять, как мой второй файл (который импортировал базу данных из первого) все еще запрашивал правильную базу данных.) Но в любом случае проблема решена. Большое спасибо за ваш ответ и ваше терпение. Стоит ли как-то отметить, что проблема решена, или описать способ решения, или удалить изначальную ветку? Я новичок в сообществе, поэтому не знаю, как правильно это сделать.

Sergii 11.01.2023 03:31
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
0
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы написали, что dbURI — это «sqlite:///myDB.db», который зависит от os.getcwd(), текущего рабочего каталога.

Убедитесь, что CWD всегда один и тот же, или используйте абсолютный путь.

Другие вопросы по теме