2013-08-02 36 views
2

將sqlalchemy.orm.relationship添加到模型是否更改了內部數據庫模式?如果ORM映射中唯一發生變化的是添加了orm.relationship,那麼是否需要添加數據庫遷移腳本?將sqlalchemy.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") 

通過上面的變化,我需要添加數據庫遷移腳本?

回答

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 on endpoint object會給你相應的服務對象。 。服務對象上的.endpoints將爲您提供一組端點對象。如果它是一對一的,那麼你可以在關係中指定uselist = False,那麼你會得到一個標量而不是一個列表