2017-03-04 105 views
0

美好的一天, 我有一組表格,從中有一些表格有多對一的關係。例如:SQLAlchemy改變關係

class Industry(Base): 
    __tablename__ = 'industry' 
    id = Column(Integer, Sequence('industry_id_seq'), nullable=False, unique=True, primary_key=True) 
    name = Column(String(255), unique=True, nullable=False) 
    companies = relationship('Company',backref=backref('industry',cascade='delete,all')) 

class Company(Base): 
    __tablename__ = 'company' 
    id = Column(Integer, Sequence('company_id_seq'), nullable=False, unique=True, primary_key=True) 
    industry_id = Column(Integer, ForeignKey(Industry.id), nullable=False) 
    name = Column(String(255), unique=True, nullable=False) 

正如您可以看到幾家公司可以屬於同一行業。有沒有人知道在多個公司之間共享該行業的公司對象應該採取什麼樣的程序?顯然,當其他公司對象出現時,我不會觸及行業對象。

+0

你能否詳細說明一下?你的意思是你想從這些公司開始移除一個行業及其所有的兒童公司嗎? –

+1

仍不清楚。你的意思是「移除一家公司」嗎?這只是['session.delete(company_instance)'](http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.delete),它標記了實例被刪除,並且在下次刷新時會發生實際刪除,或者您可以使用[Query.delete](http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query 。刪除)。雖然我相當肯定你在追求更多的東西之後,這個問題很難破譯。 –

+0

我想刪除該公司,但是,由於我在行業層面上有多對一的關係,似乎只能將公司從行業中分離出來並首先安全刪除。我試圖將該行業的指針設置爲Null,然後刪除該公司,但那也不起作用。 – Blade1024

回答

1

每個公司對象都保持一個行業ID作爲定義的外鍵。如果你刪除了一個公司,它不會成爲問題,因爲Industry Id只是一個參考,但是如果你刪除了一個行業對象,那麼這些公司使用它的ID就會導致問題。沒有行業的公司實例不能存在:

companies = session.query(Company).filter(industry.name=='Tech').all() 
#can delete all companies of same industry 
first_comp = session.query(Company).filter(industry.name=='Tech').first() 
session.delete(first_comp) 
session.commit() 
+0

沒有,仍然拋出一個例外。模型可能關閉了? IntegrityError:(_mysql_exceptions.IntegrityError)(1452,'無法添加或更新子行:外鍵約束失敗('tmp'.'company',CONSTRAINT'company_ibfk_1' FOREIGN KEY('industry_id')REFERENCES'industry'(' (參數:(無,2L)] – Blade1024

+1

爲什麼你正在更新'industry_id'?如果您要更新industry_id,那麼它必須是您Industry表中的有效外鍵。否則,您必須更改公司表中的industry_id列的'nullable = True'。 – metmirr