2

SQLAlchemy でモデルを宣言するときは、declarative_base継承元のクラスを作成します。モデルを複数の場所で宣言し、それらをさらに別のアプリケーションで (関係を使用して) 使用したい場合、これはやや問題があると思います。

私は、個別のアプリを 1 つの Web サイトにまとめることが一般的である Django のバックグラウンドからアプローチしています。各アプリは、から継承することによって独自のモデルを宣言し、django.db.models.Modelそのモデルをインポートしてアプリで使用するだけで、別のモデルとの関係を作成できます。

さまざまな場所でモデルを宣言すると、多くの場合便利です。MetaDataしかし、SQLAlchemy の明示的なorBase宣言のために、これは少し問題になります。これを処理する最善の方法が何であるかはわかりません。私の質問は次のとおりです。後で組み合わせて使用​​するために、SQLAlchemy モデルを個別に宣言する最良の方法は何ですか?

models.py宣言に独自のものを持たせるのdeclarative_baseは悪い考えだと思います (SQLAlchemy のドキュメントでは、すべての宣言型モデルは同じベースから継承する必要があると書かれています)。Django の動作をエミュレートするには、中央で宣言しdeclarative_base、それをどこにでもインポートするだけです。しかし、そのようにすると、それぞれの個別のアプリがこの中心点に結び付けられます (これは、完全に個別のアプリを作成する必要があり、Django ではない場合に問題になります)。

モデルをプルして構成する中心点が欲しいので、プロジェクトがアプリのユーザーモデルなどを使用したい場合、それをインポートして、プロジェクトのベースまたはメタデータまたは必要なものを使用するようにします。これには、「従来のマッピングMetaData」の使用が含まれる場合があります (ただし、とにかく同じものを渡す必要があります)。

編集:まあ、関連する質問 ( Reusing SQLAlchemy models across projects ) を見たところ、同じ領域に入ります。ただし、受け入れられた回答が最良の解決策であるかどうかはわかりません(または、それが1つである場合でも)。

指定時に文字列の代わりに明示的な列を使用するForeignKey

うまくいくように見える試みは次のとおりです。

app1.モデル:

Base = declarative_base()

class User(Base):
  id = Column(Integer, primary_key=True)
  name = Column(Text)

app2.モデル:

from app1.models import User

Base = declarative_base()

class Address(Base):
  user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
  user = relationship(User, backref=backref('addresses'))
  street1 = Column(Text)
  ...

うーん...

4

0 に答える 0