0

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

应用程序结构如下所示:

MyApp WS1 models.py WS2 models.py CommonPackage models.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,

恩里科

4

1 回答 1

1

当您定义一个自定义的声明性基础时,您实际上不再使用Flask-SQLAlchemy了,而是从的内部声明性基础中Flask-Migrate读取模型。Flask-SQLAlchemy(这就是为什么您必须Migrate同时使用app和进行初始化db)。

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

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

from dbpackagename import db

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

db.init_app(app) 
于 2014-05-26T14:26:08.350 回答