SQLalchemy не может найти мои таблицы, но alembic находит их просто отлично

Я начинаю проект с SQLAlchemy и Alembic. Я использую SQLite для целей тестирования.

Когда я выполняю alembic revision --autogenerate -m "...", он правильно генерирует миграции, а когда я выполняю alembic upgrade head, он создает таблицу и запускает все миграции, как и ожидалось. Я могу получить доступ, читать и писать непосредственно в БД с расширением.

Общая структура такова:

root
   |-- alembic
   |-- engine
      |-- models
         |-- __init__.py
         |-- some_model.py
         ...
      |-- db_interface.py
      |-- settings.py
      |-- test.db
      ...

Внутри engine/models/__init__.py:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

from settings import DBURI
from .some_model import SomeModel

engine = create_engine(DBURI)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

Значение DBURI равно 'sqlite:///test2.db', и оно должно быть правильным, так как alembic также импортирует то же значение.

Однако этот код не работает (как из интерфейса Python, так и при выполнении внутри db_interface.py)

from models import Session, SomeModel
db_session = Session()
db_session.query(SomeModel).first()

Часть трассировки:

File "/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 593, in do_execute
    cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: exchanges

Я также пробовал использовать эту строку: db_session.query('some_model').first() ('some_model' — это имя таблицы) Трассировка изменяется так, как если бы она искала столбец, а не таблицу:

sqlite3.OperationalError: no such column: some_model

Может ли кто-нибудь указать, что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Кроме того, если я выполню это:

from models import engine
engine.table_names()

Он возвращает пустой массив.


person Justcurious    schedule 19.12.2020    source источник
comment
'sqlite:///test2.db' — относительный URL. Вы уверены, что alembic не обновляет другой test2.db?   -  person snakecharmerb    schedule 19.12.2020
comment
Просто удалил test2.db и снова выполнил миграцию, чтобы быть уверенным. Alembic создает/обновляет правильный файл.   -  person Justcurious    schedule 19.12.2020
comment
Что если указать абсолютный путь как для приложения, так и для перегонный куб?   -  person snakecharmerb    schedule 19.12.2020
comment
Хорошо, так что вы были правы в первый раз. Я удалил файл и выполнил миграцию, как я уже сказал, но я также выполнил скрипт, который пытался получить доступ к БД, поэтому, когда он не нашел test2.db он создал пустой, где я ранее удалил. Поэтому я предположил, что это было сделано перегонным кубом. Фактически, alembic создавал файл db в одном месте, а скрипт создавал его в другом. Извините за это и большое спасибо. Если вы хотите написать это как ответ, я был бы рад принять его.   -  person Justcurious    schedule 19.12.2020
comment
Принятый ответ на связанный дубликат, вероятно, так же хорош, как и любой ответ, который я мог бы написать.   -  person snakecharmerb    schedule 03.01.2021