Flask と sqlalchemy を使用して Python で記述された Web アプリがあります。このアプリケーションは Heroku で実行され、worker として 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'
}
(これが app から db をインポートする方法に注意してください) 次のようにモデルをインスタンス化することで、アプリケーションでこれらのモデルのインスタンスを作成できます。
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()
今、私がやりたいことは、外部ワーカーでこれらのモデルのインスタンスを作成できるようにすることです。そうすることを妨げている唯一のことは、アプリ モジュールへの依存関係です。この依存関係が正当化されるとは思わないので、モデル モジュールを単純にワーカーにエクスポートし、そこで sqlalchemy インスタンスを初期化し、モデルのインスタンスを作成してデータベースに正確に保存できるようにするためのより良い設計アプローチを見つけたいと考えています。アプリケーション自体でできるのと同じ方法です。
次のように、ワーカーからデータベースに既にアクセスできることに注意してください。
db = create_engine(db_url)
metadata = MetaData(db)
print "connection to the database established"
players = Table('players', metadata, autoload=True)
s = players.select()
モデル構造をワーカーに反映させるより良い方法を探しています。具体的には、モデルが変更され、両端のコードを別々に維持する必要がある場合のシナリオを考えています。モデルを再利用し、両端で宣言を使用することができれば、ワーカー側でのメンテナンスはまったく必要ありません。