2

将 sqlalchemy.orm.relationship 添加到模型是否会更改内部数据库架构?如果 ORM 映射中唯一更改的是添加了 orm.relationship,我是否需要添加数据库迁移脚本?

例如原始映射:

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")

通过上述更改,我是否需要添加数据库迁移脚本?

4

1 回答 1

2

我假设它是一对多的关系(服务到端点)

不,您不需要向迁移脚本添加任何内容,除非它是多对多关系。在这种情况下,可能需要关联表,但它(关联表)已经成为模型的一部分。 http://docs.sqlalchemy.org/en/latest/orm/relationships.html#many-to-many

此外,仅在其中一个模型中指定关系就足够了,对于另一个方向,您可以使用 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 将为您提供一组端点对象。如果它是一对一的,那么您可以在关系中指定 uselist=False ,那么您将得到一个标量而不是一个列表

于 2013-08-02T18:54:08.303 回答