1
查詢多對多隨着Flask
和SQLAlchemy
進口:如何使用瓶SQLAlchemy的
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
我先走,並宣佈app
和db
對象:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inquestion.db'
db = SQLAlchemy(app)
我開始創建三個表:Genre
, Album
和Artist
。 由於Artist
可以鏈接到多個Albums
和Albums
可以包括多個Artists
我需要多對多的屬性,這樣就會有用於存儲Artist
到Album
IDS第四臺:
albums_to_artists_table = db.Table('albums_to_artists_table',
db.Column('album_id', db.Integer, db.ForeignKey('album.id')),
db.Column('artist_id', db.Integer, db.ForeignKey('artist.id')))
class Genre(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
class Album(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
artists = db.relationship('Artist', backref='album', lazy='dynamic', secondary=albums_to_artists_table)
class Artist(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
genre_id = db.Column(db.Integer, db.ForeignKey('genre.id'))
_albums = db.relationship('Album', secondary=albums_to_artists_table, backref=db.backref('albums_to_artists_table_backref', lazy='dynamic'))
最後,我創建數據庫:
db.drop_all()
db.create_all()
genre = Genre(name='Disco')
db.session.add(genre)
db.session.commit()
album1 = Album(name='Main Course')
album2 = Album(name='Spirits Having Flown')
db.session.add(album1)
db.session.add(album2)
db.session.commit()
artist = Artist(name='Bee Gees', genre_id = genre.id, _albums=[album1, album2])
db.session.add(artist)
db.session.commit()
現在我可以查詢什麼Artists
連接到一個給定的Genre
:
Artist.query.filter_by(genre_id = genre.id).all()
我還可以查詢什麼Albums
的Artist
連接到:
Album.query.filter(Album.artists.any(name='Bee Gees')).all()
但是我怎麼查詢:Artists
被連接到給定Genre
?換句話說,我想收集所有連接到Genre
的Artists
與給定的genre.id
?