将sqlalchemy.orm.relationship添加到模型是否会更改内部数据库架构?

时间:2013-08-02 17:58:56

标签: python sqlalchemy database-migration

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

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

1 个答案:

答案 0 :(得分: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,然后您将返回标量而不是列表