[Flask][Alembic] Невозможно установить target_metadata в env.py

Я пытаюсь создать веб-приложение с флягой, Mysql, SQLAlchemy и Alembic. Но я не могу понять, как работает импорт в python и как настроить мои target_metadata, чтобы иметь возможность использовать revision --autogenerate

Вот мое дерево каталогов:

введите здесь описание изображения

Мой веб-сайт init выглядит следующим образом:

import os
from flask import Flask

app = Flask(__name__, static_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), '../static'))
app.config.from_pyfile('config.py', silent=True)

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))

Base = declarative_base()
Base.query = db_session.query_property()

@app.teardown_appcontext
def shutdown_session(exception=None):
    db_session.remove()

from website import views

Затем в моем env.py, когда я пытаюсь импортировать свой Base следующим образом:

from website import Base
target_metadata = Base.metadata

и попробуйте запустить alembic revision --autogenerate ... я получаю эту ошибку: ImportError: No module named website.

И когда я пытаюсь импортировать Base вот так:

from website import Base
target_metadata = Base.metadata

Я получаю эту ошибку: ValueError: Attempted relative import in non-package.

Пожалуйста, не могли бы вы помочь мне понять, как работает импорт в python и как я могу установить свои target_metadata?


person Bastien    schedule 17.04.2017    source источник


Ответы (1)


У меня совсем недавно была эта проблема, но не с флягой. То, что сработало для меня, простое, но кажется необходимым (текущий каталог не находится в пути к python, поэтому, когда вы делаете from website import Base, python выдает исключение, потому что не может найти модуль веб-сайта).

Попробуйте добавить это вверху вашего модуля env.py:

import os
import sys
sys.path.append(os.getcwd())

Это действительно хакерский способ сделать это, но он работает для меня.

Кроме того, просто любопытно... Есть ли причина, по которой вы не используете библиотеки, которые делают все это за вас? Подумайте о таких, как flask-sqlalchemy, flask-migrate или flask-alembic (я не помню, что именно, но для вас это обертывает alembic). Если вы не знаете об этом, вы можете проверить реестр расширений flask. Некоторые действительно удобные там.

person oliver2213    schedule 22.04.2017