Python 使用SQLalchemy连接多个表,并使用Flask和Jinja进行评估

Python 使用SQLalchemy连接多个表,并使用Flask和Jinja进行评估,python,flask,sqlalchemy,jinja2,flask-sqlalchemy,Python,Flask,Sqlalchemy,Jinja2,Flask Sqlalchemy,我希望连接3个表,并在前端使用Flask SqlAlchemy选择特定列,以显示3个表中的所有细节 以下是模型: class Venue(db.Model): __tablename__ = 'Venue' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) city = db.Column(db.String(120)) state = db.Column(d

我希望连接3个表,并在前端使用Flask SqlAlchemy选择特定列,以显示3个表中的所有细节

以下是模型:

class Venue(db.Model):
    __tablename__ = 'Venue'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    address = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    website_link = db.Column(db.String(120))
    seeking_talent = db.Column(db.Boolean,default=False)
    genres = db.Column(db.ARRAY(db.String(120)))
    upcoming_shows = db.relationship("Upcoming_shows")
    past_shows = db.relationship("Past_shows")

class Artist(db.Model):
    __tablename__ = 'Artist'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    website_link = db.Column(db.String(120))
    seeking_talent = db.Column(db.Boolean,default=False)
    genres = db.Column(db.ARRAY(db.String(120)))
    upcoming_shows = db.relationship("Upcoming_shows")
    past_shows = db.relationship("Past_shows")

class Upcoming_shows(db.Model):
    __tablename__ = 'Upcoming_shows'

    id = db.Column(db.Integer, primary_key=True)
    venue_id = db.Column(db.Integer, db.ForeignKey('Venue.id'))
    artist_id = db.Column(db.Integer, db.ForeignKey('Artist.id'))
    start_time = db.Column(db.DateTime)

class Past_shows(db.Model):
    __tablename__ = 'Past_shows'

    id = db.Column(db.Integer, primary_key=True)
    venue_id = db.Column(db.Integer, db.ForeignKey('Venue.id'))
    artist_id = db.Column(db.Integer, db.ForeignKey('Artist.id'))
    start_time = db.Column(db.DateTime)
这是前端文件:

{% extends 'layouts/main.html' %}
{% block content %}
<div class="row shows">
    {%for show in past_show %}
    <div class="col-sm-4">
        <div class="tile tile-show">
            <img src="{{ show.image_link }}" alt="Artist Image" />
            <h4>{{ show.start_time }}</h4>
            <h5><a href="/artists/{{ show.artist_id }}">{{ show.name }}</a></h5>
            <p>playing at</p>
            <h5><a href="/venues/{{ show.venue_id }}">{{ show.name }}</a></h5>
        </div>
    </div>
    {% endfor %}
    {%for show in upcoming_shows %}
    <div class="col-sm-4">
        <div class="tile tile-show">
            <img src="{{ artists_image_link }}" alt="Artist Image" />
            <h4>{{ show.start_time }}</h4>
            <h5><a href="/artists/{{ artists_id }}">{{ artists_name }}</a></h5>
            <p>playing at</p>
            <h5><a href="/venues/{{ venues_id }}">{{ venues_name }}</a></h5>
        </div>
    </div>
    {% endfor %}
</div>
{% endblock %}
{%extends'布局/main.html%}
{%block content%}
{在过去的节目中占%_show%}
{{show.start_time}
玩弄

{%endfor%} {在即将到来的_shows%} {{show.start_time} 玩弄

{%endfor%} {%endblock%}
我已经做了多个查询,但我能显示的只是其中一个表中的信息,而不是所有的信息


谢谢

最简单的方法是查询所有三个模型并在ID上过滤:

q = (db.query(Upcoming_shows, Artist, Venue)
       .filter(Upcoming_shows.artist_id == Artist.id, 
               Upcoming_shows.venue_id == Venue.id))
for show, artist, venue in q:
    print(show.start_time, venue.name, artist.name)

这种技术称为隐式连接。还有其他显式连接技术,但它们需要更多的配置来生成高效的SQL—这种方法已经足够好了。您可以开始阅读SQLAlchemy中的连接

您可以考虑一个更改:将
即将上映的节目
过去的节目
模型合并为一个
节目
模型。可通过筛选日期来区分过去和未来的节目:

import datetime
now = datetime.datetime.now()

# Get future shows
q = (db.query(Shows, Artist, Venue)
       .filter(Shows.artist_id == Artist.id,
               Shows.venue_id == Venue.id)
       .filter(Show.start_time > now))
import datetime
now = datetime.datetime.now()

# Get future shows
q = (db.query(Shows, Artist, Venue)
       .filter(Shows.artist_id == Artist.id,
               Shows.venue_id == Venue.id)
       .filter(Show.start_time > now))