2013-08-27 51 views
1

我有兩個對象,一個Player對象和一個Team對象。查找並刪除所有空關係列表對象

我想查找數據庫中沒有玩家的所有Team對象並刪除它們。

class Team(db.Model): 
    __tablename__ = 'Team' 
    id = db.Column(db.Integer, primary_key=True) 
    players = db.relationship('Player', backref='team', lazy='dynamic') 

這是我已經試過到目前爲止(失敗):

all_teams = Team.query.all() 
for a_team in all_teams: 
    if not a_team.players: # have also tried this with a .query.all() and a .all() 
     db.session.delete(a_team) 
db.session.commit() 

我在做什麼錯?我應該如何解決這個問題?

回答

1

這可能會工作:

all_teams = Team.query.all() 
for a_team in all_teams: 
    if a_team.players.count() == 0 
     db.session.delete(a_team) 
db.session.commit() 

但是請注意,這樣做,讓效率非常低。如果您有100個團隊,上面的代碼將不得不向數據庫發出101個查詢,以確定哪些團隊需要刪除。如果您需要經常進行這些搜索,重新考慮數據庫的結構以便更容易找到空白的團隊可能是一個好主意。

+0

這工作。是的,這只是一次性的事情,因爲我修正了導致空隊的錯誤,所以我只想清理空隊。不幸的是,我仍然在if語句中保留「not」,所以所有錯誤的球隊都被刪除了,哈哈。愚蠢的我。你知道一種恢復變化的方法嗎? – GangstaGraham

+0

哦,夥計。抱歉!我希望你有一個備份。使用MySQL,您可以通過在刪除之前將日誌重放到一個條目來恢復刪除操作,但這看起來很痛苦,您可能需要調查更多,因爲我自己從來沒有做過。 – Miguel

+0

嗯,問題不大,數據庫實際上還在開發中,我們計劃在下週左右發貨,我們可能需要稍後發貨,以便在我們發貨前收集更多數據。那麼,至少我瞭解了備份的重要性,所以從現在開始我會有一個備份。我想最好是在沒有備份的情況下丟失數據,而不是在發貨後丟失數據。 – GangstaGraham

0

您是否嘗試過級聯選項?

players = db.relationship('Player', backref=backref("team",cascade="all,delete"), lazy='dynamic') 
+0

我可能會誤解這個答案,但我只想刪除一些團隊,並不是所有團隊 – GangstaGraham