使用SQLAlchemy正确查询数据库关系
我想显示我的数据库的查询结果,但它让我感到困惑 - 它不像我所期望的那样行事,每次都不显示任何内容。我的模型:使用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 %}
我要完成什么:我希望能够显示id
和ball_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 = ?
你让你的查询过于复杂。您已经提供了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
,并且不必太多地混淆连接或其他复杂查询。
打印“{{field}}”时,我无法访问“Ball”字段,输出为“
这是因为'{{field}}'输出对象的字符串表示形式。当你的模板使用'{{field.id}}'时会发生什么? – robmathers
它正确呈现'Field'模型字段,并且可以方便地访问这些值(就像你写的那样),但是现在我认为这是一个关系问题 - 就在我想我已经计算出来并改变了''back_populates ='字段时在''Ball''模型中,''''为''back_populates =“balls”'',错误 ''Mapper'Mapper | Field | fields'没有属性'balls'''出现。 – PotatoBox
如果打印查询只是一个故障排除步骤,您可能需要重命名您的问题,以便解决查询数据库的实际问题。 – robmathers