Flask-migrate多个models.py

时间:2014-05-26 10:41:43

标签: flask flask-sqlalchemy flask-migrate

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

应用程序结构如下所示:

MyApp的    WS1       models.py    WS2       models.py    CommonPackage       models.py

如何导入所有模块并初始化数据库?我试图手动导入它们但不起作用。 我知道如果我分别从WS1或Ws2导入“app”,它可以工作,但我想在一次操作中执行此操作,这可能吗?

在这里您可以找到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,

恩里科

1 个答案:

答案 0 :(得分:1)

当您定义自定义声明基础时,您实际上不再使用Flask-SQLAlchemy - Flask-MigrateFlask-SQLAlchemy的内部声明基础读取模型。 (这就是为什么你必须用Migrateapp初始化db

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

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

app.py