Я начинаю проект с 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()
Он возвращает пустой массив.
'sqlite:///test2.db'
— относительный URL. Вы уверены, что alembic не обновляет другойtest2.db
? - person snakecharmerb   schedule 19.12.2020test2.db
и снова выполнил миграцию, чтобы быть уверенным. Alembic создает/обновляет правильный файл. - person Justcurious   schedule 19.12.2020test2.db
он создал пустой, где я ранее удалил. Поэтому я предположил, что это было сделано перегонным кубом. Фактически, alembic создавал файл db в одном месте, а скрипт создавал его в другом. Извините за это и большое спасибо. Если вы хотите написать это как ответ, я был бы рад принять его. - person Justcurious   schedule 19.12.2020