пытается получить набор данных из нескольких таблиц - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь собрать две таблицы, чтобы получить нужные мне данные с помощью flask -sqlalchemy. Таблица «Место проведения» содержит город и штат места проведения, а таблица «Показать» отслеживает представления для каждого места проведения. Мне нужен запрос, чтобы сгруппировать объекты по городу и штату, а затем подсчитать количество шоу, где start_time больше, чем сейчас. Пока все, что у меня есть, это:

query = db.session.query(Venue.city, Venue.state, Venue.name, Venue.id, Show.venue_id, Show.start_time).group_by(Venue.city)

, но я не знаю, где оттуда go и даже если это правильная отправная точка. Это мои модели:

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))
    seeking_talent = db.Column(db.Boolean, default=False)
    seeking_description = db.Column(db.String())
    genres = db.Column(db.ARRAY(db.String))
    website = db.Column(db.String())
    pastshows = db.relationship('Show', backref='pastshows', lazy=True)

class Show(db.Model):
    __tablename__ = 'show'
    id = db.Column(db.Integer, primary_key=True)
    venue_id = db.Column(db.Integer, db.ForeignKey('venue.id'), nullable=False)
    artist_id = db.Column(db.Integer, db.ForeignKey('artist.id'), nullable=False)
    artist_name = db.Column(db.String())
    venue_name = db.Column(db.String())
    venue_image = db.Column(db.String())
    start_time = db.Column(db.DateTime(), nullable=False)

, и это данные, которые мне нужны:

data=[{
    "city": "San Francisco",
    "state": "CA",
    "venues": [{
      "id": 1,
      "name": "The Musical Hop",
      "num_upcoming_shows": 0,
    }, {
      "id": 3,
      "name": "Park Square Live Music & Coffee",
      "num_upcoming_shows": 1,
    }]
  }, {
    "city": "New York",
    "state": "NY",
    "venues": [{
      "id": 2,
      "name": "The Dueling Pianos Bar",
      "num_upcoming_shows": 0,
    }]
  }]

Может ли кто-нибудь помочь мне с этим запросом?

1 Ответ

0 голосов
/ 26 мая 2020

Вам нужно использовать .join () , который выполняет SQL JOIN между двумя таблицами - если вы этого не сделаете, вы получите то, что называется декартовым товар. Если у вас есть список ['a', 'b'] и [1, 2, 3], то декартово произведение - ['a1', 'a2', 'a3', 'b1', 'b2', 'b3'], и вы, вероятно, увидите, что он скоро выйдет из-под контроля.

В любом случае, код, который вы ищете for выглядит похоже на то, что у вас есть

query = db.session.query(
    Venue.city,
    Venue.state,
    Venue.name,
    Venue.id,
    Show.venue_id,
    Show.start_time
).select_from(Venue).join(
    Show, Show.venue_id = Venue.id
).group_by(Venue.city)

Есть несколько вещей, которые я написал максимально подробно, но их можно упростить, хотя:

  1. .select_from сообщает вам предложение FROM, но если оно опущено, берется таблица самого первого аргумента .query(), поэтому Venue уже является здесь по умолчанию.
  2. Вы объявили pastshows как Relationship , значит, Flask -SQLAlchemy должен знать, как связать две таблицы. В этом случае вам не нужно указывать, что это идентификатор места, который соответствует venue_id, и вместо этого код становится .join(Show), он делает явное неявное.

Таким образом , следующее тоже должно работать, но оно неявно обрабатывает больше вещей и, следовательно, имеет более высокую степень магии c. Хотел добавить для полноты картины.

query = db.session.query(
    Venue.city,
    Venue.state,
    Venue.name,
    Venue.id,
    Show.venue_id,
    Show.start_time
).join(Show).group_by(Venue.city)
...