2016-11-19 90 views
1

查詢多對多隨着FlaskSQLAlchemy進口:如何使用瓶SQLAlchemy的

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

我先走,並宣佈appdb對象:

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inquestion.db' 
db = SQLAlchemy(app) 

我開始創建三個表:GenreAlbumArtist。 由於Artist可以鏈接到多個AlbumsAlbums可以包括多個Artists我需要多對多的屬性,這樣就會有用於存儲ArtistAlbum 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() 

我還可以查詢什麼AlbumsArtist連接到:

Album.query.filter(Album.artists.any(name='Bee Gees')).all() 

但是我怎麼查詢:Artists被連接到給定Genre?換句話說,我想收集所有連接到GenreArtists與給定的genre.id

回答

1

但是,如何查詢藝術家連接到給定的流派?換句話說,我想收集所有的藝術家鏈接到一個流派與給定的genre.id?

你給你的問題一個例子正是這樣做的,由Genre得到Artist。我認爲你實際上要問的是如何通過Genre得到Album,是嗎?如果是這樣,請嘗試如下所示:

Album.query.join(Artist).join(Genre).filter(Genre.id==YOUR_GENRE_ID).all()