在我的 Flask 應用程式上使用 sqlalchemy 找出正確的查詢以獲得我想要的結果時遇到問題。我需要查詢將結果作為字典串列回傳,如下面的代碼
[{
"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,
}]
}]
我正在嘗試回傳資料庫中的場地串列,但現在按他們的州和城市分組并加入演出表以獲取該特定場地即將上映的演出數量,如上面的串列所示。
為了解釋上面的字典串列,查詢從場所表中回傳 2 列,它們是州和城市,然后是別名呼叫場所,它還回傳包含該州和城市的場所名稱的字典串列,以及根據與節目表的關系,計算每個場地即將上映的節目。
我有 3 個模型表場地、藝術家和表演,它們之間有多對多的關系
class Show(db.Model):
__tablename__ = "shows"
id = db.Column(db.Integer, primary_key=True)
artist_id = db.Column(db.Integer, db.ForeignKey('artists.id'))
venue_id = db.Column(db.Integer, db.ForeignKey('venues.id'))
start_time = db.Column(db.DateTime(timezone=True))
artist = db.relationship("Artist", backref=db.backref("shows", cascade="all, delete-orphan"))
venue = db.relationship("Venue", backref=db.backref("shows", cascade="all, delete-orphan"))
class Artist(db.Model):
__tablename__ = 'artists'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(), nullable=False)
description = db.Column(db.String(), nullable=False)
city = db.Column(db.String(120), nullable=False)
state = db.Column(db.String(120), nullable=False)
phone = db.Column(db.String(120), nullable=False)
genres = db.Column(db.String(), nullable=False)
image_link = db.Column(db.String(500), nullable=False)
facebook_link = db.Column(db.String(120), nullable=False)
website_link = db.Column(db.String(300), nullable=False)
looking_for_venue = db.Column(db.Boolean, nullable=False, default=False)
class Venue(db.Model):
__tablename__ = 'venues'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(), nullable=False)
description = db.Column(db.String(), nullable=True)
genres = db.Column(db.String(), nullable=False)
city = db.Column(db.String(120), nullable=False)
state = db.Column(db.String(120), nullable=False)
address = db.Column(db.String(300), nullable=False)
phone = db.Column(db.String(120), nullable=True, unique=True)
image_link = db.Column(db.String(500), nullable=True)
facebook_link = db.Column(db.String(300), nullable=False)
website_link = db.Column(db.String(300), nullable=True)
looking_for_talent = db.Column(db.Boolean, nullable=False, default=False)
如果有人可以幫助我處理 SQL 查詢和 SQLAlchemy 查詢,我將不勝感激
uj5u.com熱心網友回復:
SQL查詢:
select v.city, v.state, v.name, v.id, count(v.id)
from show s
join venue v on v.id = s.venue_id
group by v.city, c.state, v.name, v.id
SQLAlchemy 查詢等效:
query = Show.query.join(Venue)
.with_entities(Venue.city, Venue.state, Venue.name, Venue.id, func.count(Venue.id))
.group_by(Venue.city, Venue.state, Venue.name, Venue.id)
這將只是一個查詢。所以在我看來分組可以在應用程式站點完成:
results = {}
for city, state, name, id, show_count in query:
location = (city, state)
if location not in results:
results[location] = []
results[location].append({"id": id, "name": name, "num_upcoming_shows": show_count})
output = [
{"city": key[0], "state": key[1], "venues": value for key, value in results.items()
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482768.html
標籤:Python 数据库 PostgreSQL 烧瓶 sqlalchemy
