我想显示我的数据库的查询结果,但它让我感到困惑 - 它没有按照我的预期行事,不会每次都显示任何内容。我的模特:
class Ball(Base):
__tablename__ = 'balls'
id = Column(Integer, primary_key=True)
ball_id = Column(Integer, ForeignKey('fields.id'))
ball = relationship("Field", back_populates="fields")
class Field(Base):
__tablename__ = 'fields'
id = Column(Integer, primary_key=True)
nickname = Column(String)
places = relationship("Ball", order_by=Ball.id, back_populates="fields")
我在Flask中的代码:
@app.route("/addball", methods=['GET', 'POST'])
def addball():
records = dict()
with create_session() as session:
for field in session.query(Field).order_by(Field.nickname.asc()).all():
record = (session.query(Field).
join(Ball).
filter(Ball.field_id == field.id))
if record:
records[field.id] = record
return render_template("addball.html", form=form, records=records)
和Jinja模板:
{% for key, field in records.items() %}
{% for elem in field %}
{{ elem }}
{% endfor %}
{% endfor %}
我想要完成的任务:我希望能够为每个字段显示id
和ball_id
以及nickname
。到目前为止,我最好的拍摄是在Jinja模板中显示查询,如下所示:
SELECT fields.id AS fields_id, fields.nickname AS fields_nickname FROM fields JOIN balls ON balls.id = balls.ball_id WHERE balls.ball_id = ?
答案 0 :(得分:0)
您的查询过于复杂。您已经提供了SQLAlchemy关系信息,因此不必担心尝试使用连接创建查询。
要获取字段列表并显示相关的球数据,我会沿着这些方向做一些事情(道歉,如果这不完全匹配您的架构,但它应该接近):
在你的Flask路线中:
records = session.query(Field.order_by(Field.nickname.asc()).all()
return render_template("addball.html", form=form, records=records)
在你的模板中:
{% for field in records %}
<p>
Field ID: {{ field.id }}
Ball ID: {{ field.ball.id }}
Nickname: {{ field.nickname }}
</p>
{% endfor %}
ORM的重点在于您返回具有将在相关表之间链接的属性的对象,以便您可以像访问代码中的任何其他对象和变量一样访问数据,例如field.ball
和不必过多地使用连接或其他复杂查询。