2017-08-31 83 views
-1

我想显示我的数据库的查询结果,但它让我感到困惑 - 它不像我所期望的那样行事,每次都不显示任何内容。我的模型:使用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") 

我的代码在瓶:

@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) 

和神社模板:

{% for key, field in records.items() %} 
    {% for elem in field %} 
     {{ elem }} 
    {% endfor %} 
{% endfor %} 

我要完成什么:我希望能够显示idball_id和也为每个领域的nickname。我最好的拍摄至今在金贾模板,显示查询,像这样:

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

如果打印查询只是一个故障排除步骤,您可能需要重命名您的问题,以便解决查询数据库的实际问题。 – robmathers

回答

0

你让你的查询过于复杂。您已经提供了SQLAlchemy关系信息,因此不用担心尝试使用联接创建查询。

要获得字段列表,并显示相关数据的球,我会做的东西沿着这些路线(道歉,如果这不完全符合您的架构,但它应该是接近):

在你瓶路线:

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的整点是,你回来的对象与将相关表之间的连接,因此T特性您可以像访问代码中的任何其他对象和变量一样访问数据,如field.ball,并且不必太多地混淆连接或其他复杂查询。

+0

打印“{{field}}”时,我无法访问“Ball”字段,输出为“' ',所以没有''球''领域。 session.query(Field,Ball).filter(Field.id == Ball.id).order_by(Field.nickname.asc())。all()''得到了''(<字段(id ='1',name ='stadium')>,)',但它完全忽略了ORM的要点。 – PotatoBox

+0

这是因为'{{field}}'输出对象的字符串表示形式。当你的模板使用'{{field.id}}'时会发生什么? – robmathers

+0

它正确呈现'Field'模型字段,并且可以方便地访问这些值(就像你写的那样),但是现在我认为这是一个关系问题 - 就在我想我已经计算出来并改变了''back_populates ='字段时在''Ball''模型中,''''为''back_populates =“balls”'',错误 ''Mapper'Mapper | Field | fields'没有属性'balls'''出现。 – PotatoBox