【问题标题】:join multiple tables using SQLalchemy and assess it using Flask and Jinja使用 SQLalchemy 连接多个表并使用 Flask 和 Jinja 对其进行评估
【发布时间】:2020-08-26 06:33:32
【问题描述】:

我正在寻找连接 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 %}

我已经完成了多个查询,但我只能显示其中一张表中的信息,而不是全部一起

谢谢

【问题讨论】:

    标签: python flask sqlalchemy jinja2 flask-sqlalchemy


    【解决方案1】:

    最简单的方法是查询所有三个模型并过滤 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)
    

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

    这种技术称为隐式连接。还有其他显式连接技术,但它们需要更多配置才能生成高效的 SQL - 这种方法足以开始使用。您可以开始阅读 SQLAlchemy here 中的连接。

    您可能会考虑进行一项更改:将Upcoming_showsPast_shows 模型合并为一个Shows 模型。过去和未来的节目可以通过日期过滤来区分:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2017-06-08
      相关资源
      最近更新 更多