まず、metadata
を共有し、フラスコ - sqlalchemy db.Modelを再利用可能なアプリケーションのベースとして使用しないでください。
2番目には、信号、ショートカットなどをサポートするために、flask-sqlalchemyから新しいベースを拡張してすべてのクラスを再作成する必要があります。
塩基を統合し(それがあってもよいバギー):
def integrate_models(cls, nbase):
new_bases = list(cls.__bases__) + [nbase]
new_dict = dict(cls.__dict__)
new_dict.update(dict(nbase.__dict__))
return type.__new__(cls.__class__, cls.__name__, tuple(new_bases), new_dict)
SQLAlchemyの拡張子を持つ
例フラスコアプリ:
# -*- coding: utf-8 -*-
from flask import Flask
from flaskext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
if __name__ == '__main__':
from some_model_base import init_metadata
init_metadata(db.Model.metadata)
from some_model import SomeClass
SomeClass = integrate_models(SomeClass, db.Model)
db.create_all()
print SomeClass.query.all()
some_model_base.py:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
def init_metadata(metadata):
Base.metadata = metadata
そしてsome_model.py :
from sqlalchemy import Column, Integer, String
from some_model_base import Base
class SomeClass(Base):
__tablename__ = 'some_table'
id = Column(Integer, primary_key=True)
name = Column(String(50))
この例では、db.create_allおよびSomeClass.queryショートカットのみをテストしました。
私の貧しい人々のために申し訳ありません。
私はこれを試してみる必要があります。メインプログラムのモデルとの関係を持つように他のモジュールのモデルを構成する方法を見つけることができますか? –
私は、あなたの再利用可能なアプリケーションベースクラスまたはMixInsで宣言し、それらをサブクラス化する具体的なモデルを構築するのが最善の方法だと思います。 – estin