2016-11-20 83 views
1

enter image description here如何查詢許多一對多的SQLAlchemy

導入FlaskSQLAlchemy模塊第一:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

聲明appdb對象:

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

有三個表: ArtistAlbumGenre。所述Artist對象可以鏈接到多個Albums。而Album對象可以鏈接到多個Artists。該albums_to_artists_table是保持ArtistsAlbums緊之間的關係:

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(80), unique=True) 
    genre_id = db.Column(db.Integer, db.ForeignKey('genre.id')) 

    artists = db.relationship('Artist', backref='albums', 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) 
    _albums = db.relationship('Album', secondary=albums_to_artists_table, backref=db.backref('albums_to_artists_table_backref', lazy='dynamic')) 

所以我們有一個鏈接到鏈接到GenreAlbumArtist,它看起來像這樣:Artist>Album>Genre

有了這個設置在地方,我們繼續前進,首先創建Genre對象:

db.drop_all() 
db.create_all() 

genre = Genre(name='Heavy Metal') 
db.session.add(genre) 
db.session.commit() 

然後兩張專輯:

album1 = Album(name='Ride the Lightning', genre_id = genre.id) 
album2 = Album(name='Master of Puppets ', genre_id = genre.id) 
db.session.add(album1) 
db.session.add(album2) 
db.session.commit() 

和藝術家:

artist = Artist(name='Metallica', _albums=[album1, album2]) 

db.session.add(artist) 
db.session.commit() 

後,創建數據庫我們可以查詢什麼Albums鏈接到Genre

print Album.query.filter_by(genre_id=1).all() 

什麼Artists鏈接到Album

print Artist.query.filter(Artist._albums.any(id=album1.id)).all() 

現在我想查詢所有鏈接到一個Genre經過genre.id的Artists。如何實現它?

enter image description here

+0

嗯,你們的關係沒有按「T似乎我的權利....您當前的關係一張專輯只能有一個流派,這意味着對於一個藝術家鏈接到X流派他必須有x張專輯......也就是你想要的嗎? – danidee

+0

是的,這是故意的專輯和流派有一對一的關係。 – alphanumeric

回答

1

可以在Artist.albums.any()應用過濾器,這將產生一個子查詢:

Artist.query.filter(Artist.albums.any(genre_id=genre.id)).all() 

或者您可以使用相簿join()

Artist.query.join(Artist.albums).filter_by(genre_id=genre.id).all() 
+0

難道你不是指genre_id? (Artist.albums.any)(genre_id = genre.id))。all())' )'? – danidee

+0

當然,修正了錯字。感謝danidee! – Dauros