2

モデルに sqlalchemy.orm.relationship を追加すると、内部 DB スキーマが変更されますか? ORM マッピングで変更されたのが orm.relationship の追加のみである場合、DB 移行スクリプトを追加する必要がありますか?

たとえば、元のマッピング:

class Service(Base):
    __tablename__ = 'service'
    id = sql.Column(sql.String(64), primary_key=True)
    type = sql.Column(sql.String(255))
    extra = sql.Column(sql.Text())


class Endpoint(Base):
    __tablename__ = 'endpoint'
    id = sql.Column(sql.String(64), primary_key=True)
    legacy_endpoint_id = sql.Column(sql.String(64))
    interface = sql.Column(sql.String(8), primary_key=True)
    region = sql.Column('region', sql.String(255))
    service_id = sql.Column(sql.String(64),
                            sql.ForeignKey('service.id'),
                            nullable=False)
    url = sql.Column(sql.Text())
    extra = sql.Column(sql.Text())

変更されたマッピング:

@@ -3,6 +3,7 @@
     id = sql.Column(sql.String(64), primary_key=True)
     type = sql.Column(sql.String(255))
     extra = sql.Column(sql.Text())
+    endpoints = sql.orm.relationship("Endpoint")


 class Endpoint(Base):
@@ -16,4 +17,5 @@
                             nullable=False)
     url = sql.Column(sql.Text())
     extra = sql.Column(sql.Text())
+    service = sql.orm.relationship("Service")

上記の変更により、DB 移行スクリプトを追加する必要がありますか?

4

1 に答える 1

2

1対多の関係(サービスからエンドポイント)であると想定しています

いいえ、多対多の関係でない限り、移行スクリプトに何も追加する必要はありません。その場合、関連付けテーブルが必要になる場合がありますが、それ (関連付けテーブル) は既にモデルの一部になっています。 http://docs.sqlalchemy.org/en/latest/orm/relationships.html#多対多

また、モデルの 1 つのみでリレーションシップを指定するだけで十分です。逆方向の場合は backref オプションを使用できます。

class Service(Base):
    __tablename__ = 'service'
    id = sql.Column(sql.String(64), primary_key=True)
    type = sql.Column(sql.String(255))
    extra = sql.Column(sql.Text())
    endpoints = sql.orm.relationship("Endpoint", backref="service")

これは現在、双方向の関係です。これで、エンドポイント オブジェクトの .service によって、対応するサービス オブジェクトが提供されます。また、サービス オブジェクトの .endpoints は、エンドポイント オブジェクトの配列を提供します。1 対 1 の場合、関係で uselist=False を指定すると、リストの代わりにスカラーが返されます。

于 2013-08-02T18:54:08.303 に答える