【发布时间】:2014-02-27 13:31:52
【问题描述】:
我有一个使用 Flask 和 sqlalchemy 用 python 编写的网络应用程序。这个应用程序在 Heroku 上运行,作为一个工人,我使用 Ironworker 扩展,我在 models 模块中定义了我的所有模型,如下所示:
from app import db
class Player(db.Model):
__tablename__ = 'players'
id = db.Column(db.Integer, primary_key=True)
....
type = db.Column(db.String(50))
def __init__(self, ....):
....
__mapper_args__ = {
'polymorphic_identity':'player',
'polymorphic_on':type
}
class Outfielder(Player):
__tablename__ = 'outfielders'
id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'outfielder'
}
class Goalkeeper(Player):
__tablename__ = 'goalkeepers'
id = db.Column(db.Integer, db.ForeignKey('players.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'goalkeeper'
}
(注意这是如何从应用程序导入数据库的) 我可以通过实例化模型在我的应用程序中创建这些模型的实例,如下所示:
db = SQLAlchemy(app)
gk = models.Goalkeeper('John', 'Snow', 1, 1, 3456, 67, 55, 187)
of = models.Outfielder('Gary', 'Lineker', 1, 1, 3999, 77, 78, 176)
db.session.add(gk)
db.session.add(of)
db.session.commit()
现在,我想做的是能够在我的外部工作人员上创建这些模型的实例。唯一阻止我这样做的是对我的应用程序模块的依赖。我不觉得这种依赖是合理的,并且希望找到一种更好的设计方法,能够简单地将我的模型模块导出到 worker 并在那里初始化 sqlalchemy 实例,并创建我的模型实例并将它们完全保存到数据库中我可以在应用程序本身中执行此操作。
请注意,我已经可以像这样从工作人员访问我的数据库:
db = create_engine(db_url)
metadata = MetaData(db)
print "connection to the database established"
players = Table('players', metadata, autoload=True)
s = players.select()
我只是在寻找一种更好的方法来将我的模型结构反映在工人身上。具体来说,我正在考虑我的模型发生变化时的场景,我将不得不分别维护两端的代码。如果我设法重用模型并在两端使用声明性,那么工作人员将不会有任何维护。
【问题讨论】:
-
可能最好的方法是将模型与 Flask-SQLAlchemy 分开定义,并允许 Flask-SQLAlchemy 使用在单独模块中定义的模型,而不是让 Flask-SQLAlchemy 让您使用内置的db.模型库。不幸的是,Flask-SQLAlchemy 的设计并不容易做到这一点,这个问题有望be addressed in the next version。参见this question。
标签: heroku sqlalchemy flask flask-sqlalchemy ironworker