使用SQLAlchemy

时间:2017-08-31 15:24:17

标签: flask jinja2 flask-sqlalchemy

我想显示我的数据库的查询结果,但它让我感到困惑 - 它没有按照我的预期行事,不会每次都显示任何内容。我的模特:

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 %}

我想要完成的任务:我希望能够为每个字段显示idball_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 = ? 

1 个答案:

答案 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和不必过多地使用连接或其他复杂查询。