flask-sqlalchemy:在两个表

时间:2017-08-29 21:08:27

标签: python sqlite flask sqlalchemy flask-sqlalchemy

我在SQLite3数据库中有以下两个表:

class Golfer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=True)
    scores = db.relationship('Score', backref='associated_golfer', lazy='dynaic')

class Score(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    score = db.Column(db.Integer, nullable=False)
    golfer_name = db.Column(db.String(100), db.ForeignKey('golfer.name'), nullable=False)

我的GolferScore表分别包含以下数据:

id|name
1|Johnny Metz
2|Cody Blick
3|Zack Bailey

id|score|golfer_name
1|71|Johnny Metz
2|72|Cody Blick
3|68|Cody Blick
4|70|Zack Bailey
5|73|Zack Bailey
6|66|Johnny Metz

我正在使用Flask-SQLAlchemy从这些表中获取数据。我想将Golfer表中的每个名称映射到Score表中的所有分数。这是我到目前为止所做的事情,但它非常混乱和低效,特别是随着我的数据增长:

golfers = Golfer.query.all()  # get list of all rows in Golfer table
scores = Score.query.all()  # get list of all rows in Score table
golfer_to_scores = {}
for golfer in golfers:
    golfer_to_scores[golfer] = []
    for score in scores:
        if score.golfer_name == golfer.name:
            golfer_to_scores[golfer].append(score)
print(golfer_to_scores)
# {<Golfer obj>: [<Score obj>, <Score obj>], ...}

使用Flask-SQLAlchemy的SQL操作有更简单的方法吗?也许在Golfer表中生成一个列,该列存储与该高尔夫球手相关的所有得分(也就是Score表中的行)的列表?

1 个答案:

答案 0 :(得分:2)

如果关系配置正确,那么只需:

golfer_to_scores = {golfer: list(golfer.scores) for golfer in Golfer.query.all()}

虽然每个高尔夫球手都会进行一次查询,但您可能想要加入。