Python 使用SQLalchemy连接多个表,并使用Flask和Jinja进行评估
我希望连接3个表,并在前端使用Flask SqlAlchemy选择特定列,以显示3个表中的所有细节 以下是模型: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
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))