我在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)
我的Golfer
和Score
表分别包含以下数据:
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
表中的行)的列表?
答案 0 :(得分:2)
如果关系配置正确,那么只需:
golfer_to_scores = {golfer: list(golfer.scores) for golfer in Golfer.query.all()}
虽然每个高尔夫球手都会进行一次查询,但您可能想要加入。