Flask-SQLAlchemy предлагает шаблон декларативный для настройки подключения к базе данных. Пример жестко кодирует один путь к базе данных, и мне кажется, что этого следует избегать, чтобы я мог настраивать разные базы данных для модульного тестирования, локальной разработки и, в конечном итоге, производства.
это их база данных.py:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
# import all modules here that might define models so that
# they will be registered properly on the metadata. Otherwise
# you will have to import them first before calling init_db()
import yourapplication.models
Base.metadata.create_all(bind=engine)
Но я не смог выяснить, как избежать жесткого кодирования этого пути БД.
Переменные среды:
Я мог бы просто заменить путь sqlite:///....
на переменную окружения. Но для этого потребуется какой-то способ запустить pytest
с одним набором переменных среды, а flask run
использовать другой набор. Я бы предпочел, чтобы мои модульные тесты отслеживали их собственную временную базу данных. [2] Мне также хотелось бы, чтобы create_app()
создавало приложение Flask, которое выбирало бы путь к базе данных, который является переменной config.
Импорт database.py в контексте приложения
Я думал, что смогу заменить путь к базе данных на current_app.config['DB']
и импортировать базу данных в with app.app_context()
. Но классы Model должны импортировать Base, и я не могу создать подкласс Base в контексте приложения. Поэтому, когда модели загружаются, они загружаются вне контекста приложения, и это приводит к ошибкам во время выполнения.
Так, как правильно использовать Declarative_base в приложении фляги с юнит-тестами?
Спасибо за вашу помощь!
[2]: Если это то, что я должен делать, тогда я могу жить с этим. Но кажется, что использование env vars там беспорядочно, когда я настраиваю приложение фляги со своими собственными настройками vars.