如何使用FlaskSQLAlchemy确保正确的元数据对象以避免Alembic删除表

2024-04-19 09:02:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask应用程序,其中数据库对象的创建和管理是使用Flask-SQLAlchemy处理的,数据库迁移是使用Flask-Migrate完成的

当我尝试使用flask db migrate创建数据库迁移时,我的一些表在结果迁移中被删除,类似于this issue

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected removed table 'media'
INFO  [alembic.autogenerate.compare] Detected removed table 'api'

在我的virtualenv中,FLASK_APP变量指向包含create_app工厂和其他工厂的类。你知道吗

declare -x FLASK_APP="app/app.py"

app/extensions.py中,我将db对象定义为db = SQLAlchemy(),在app/app.py中,我可以创建应用程序工厂、配置扩展和蓝图等

from app.extensions import db

def configure_extensions(app):
  # Database
  db.init_app(app)

  # Flask-Migrate
  migrate.init_app(app, db)

def create_app():
    app = Flask("app")
    app.config.from_object(Config)
    configure_app(app, Config)
    register_blueprints(app)
    configure_extensions(app)

    return app

在我的模型里。我将模型类定义为db.Model,而不是我自己的基类,这是一个问题吗?你知道吗

from app.extensions import db, passlib
from app.database import CRUDMixin

class Media(db.Model):
        __tablename__ = 'media'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(255), nullable=False)
        # [sic]

我该怎么解决这个问题?你知道吗

谢谢


Tags: 对象frompyimportinfo数据库app应用程序