将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")
通过上述更改,我是否需要添加数据库迁移脚本?
答案 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,然后您将返回标量而不是列表