【问题标题】:Find And Delete All Empty Relationship List Objects查找并删除所有空关系列表对象
【发布时间】:2013-08-27 18:41:18
【问题描述】:

我有两个对象,一个 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()

我做错了什么?我应该如何解决这个问题?

【问题讨论】:

    标签: python database sqlalchemy flask flask-sqlalchemy


    【解决方案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 个查询以确定需要删除哪些团队。如果您需要经常进行这些搜索,最好重新考虑数据库的结构,以便更轻松地找到空团队。

    【讨论】:

    • 这行得通。是的,这只是一次性的事情,因为我修复了导致空团队的错误,所以我只想清理空团队。不幸的是,我仍然在 if 语句中保留了“不”,所以所有错误的团队都被删除了,哈哈。愚蠢的我。您知道还原更改的方法吗?
    • 哦,伙计。对不起!我希望你有一个备份。使用 MySQL,您可以通过在删除之前将日志重播到一个条目来恢复删除,但这似乎很痛苦,您可能需要进行更多调查,因为我自己从未这样做过。
    • 嗯,问题不大,数据库其实还在开发中,我们计划在下周左右发货,可能需要稍后发货,收集更多发货前的数据。好吧,至少我知道了备份的重要性,所以从现在开始我会有备份。我想最好在没有备份的情况下在发货前丢失数据,而不是在发货后丢失。
    【解决方案2】:

    您是否尝试过级联选项?

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

    【讨论】:

    • 我可能误解了这个答案,但我只想删除部分团队,而不是全部
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多