【问题标题】:Flask-migrate multiple models.py烧瓶迁移多个模型.py
【发布时间】:2014-05-26 10:41:42
【问题描述】:

我有一个与 Flask-migrate 相关的问题。 我正在使用 Flask 创建一组 Web 服务。我已经在 python 应用程序中将每个 Web 服务拆分为他自己的包。

应用程序结构如下所示:

我的应用 WS1 模型.py WS2 模型.py 通用包 模型.py

如何导入所有模块并初始化数据库?我试图手动导入它们,但不工作。 我知道如果我分别从 WS1 或 Ws2 导入“应用程序”,它会起作用,但我想在一个操作中做到这一点,这可能吗?

您可以在这里找到 Flask-migrate 的代码:

#!virtualenv/bin/python

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from config import SQLALCHEMY_DATABASE_URI

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)

migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

from WS1.models import Class1, Class2, Class3    <--- This is not importing
from WS2.models import Class4, Class5, Class6    <--- This is not importing

if __name__=='__main__':
    manager.run()

这是我初始化 SQLAlchemy 会话的模块:

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

engine = create_engine(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()

所有模型都导入这个模块并继承自Base。

Thanks a lot,

恩里科

【问题讨论】:

  • 您之前是否尝试过导入模型,例如在初始化Migrate之前?
  • 我试过但还是不行:/
  • 模型类必须继承自 db.Model 才能导入。我猜他们不会,因为您可能会有一个导入周期。将 db 声明移到可以在没有循环的情况下导入它的地方,并让所有模型类扩展 db.Model
  • 就是这样,我对 python/flask/sqlalchemy 很陌生。我已经创建了一个解决方案的工作原型,现在我开始正确地编写实际的解决方案。出于这个原因,我试图正确地分离类/模块/包。我想出的是我创建了一个 SQLAlchemyDatabase 模块,就像你可以在我的问题的编辑版本中找到的那样,然后我的 SQLAlchemy 模型继承自 SQLAlchemyDatabase Base。从我读到的内容来看,这应该是正确的原因,我错了吗? (谢谢你的时间:))

标签: flask flask-sqlalchemy flask-migrate


【解决方案1】:

当您定义自定义声明基时,您实际上并没有使用Flask-SQLAlchemy,而Flask-Migrate 会从Flask-SQLAlchemy 的内部声明基中读取模型。 (这就是为什么你必须用appdb 来初始化Migrate)。

Flask 解决了导入周期问题:大多数 Flask 扩展都有一个.init_app() 方法来在必要时推迟初始化扩展。

在您当前手动创建Base 的模块中,只需执行db = SQLAlchemy(),然后在您的模型中导入db 并使用db.Models 作为您的声明基础而不是Base。在您的 app.py 中,执行以下操作:

from dbpackagename import db

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI

db.init_app(app) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多