2016-11-20 2 views
1

enter image description here쿼리하는 방법을 대다 SQLAlchemy의

가져 오기 Flask 먼저 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) 

는 세 개의 테이블이 있습니다 : Artist, AlbumGenre. Artist 개체는 여러 Albums에 연결할 수 있습니다. 개체는 여러 Artists에 연결할 수 있습니다.

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')) 

그래서 우리가 Genre에 연결되어있는 Album에 연결된 Artist을 가지고 있고 그것은 다음과 같습니다 : Artist> Album> Genre albums_to_artists_tableArtistsAlbums 사이의 관계를 유지하는 것입니다.

데 우리가 가서 먼저 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이에 연결된 쿼리를 생성 할 수 있습니다.:

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

어떤 ArtistsAlbum에 연결되어 있습니다 :

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

은 지금은 조회하고자하는 모든 genre.id을 통과하는 Genre에 링크 된 Artists. 그것을 성취하는 방법?

enter image description here

당신은 하위 쿼리 생성하는 Artist.albums.any()에 필터를 적용 할 수 있습니다
+0

흠, 당신의 관계는 아무튼 내게 맞는 것 같아. 당신의 현재 관계로 한 앨범은 단 하나의 장르 밖에 가질 수 없다. 이는 장르가 X 장르에 링크되어있는 아티스트의 경우 그는 x 개의 앨범도 가지고 있어야합니다 .... 당신이 의도 한 것입니까? – danidee

+0

예, 앨범과 장르가 일대일 관계를 갖는 것은 의도적입니다. – alphanumeric

답변

1

:

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.query.filter (artist.albums.any (genre_id = genre.id)). all())'또는'Artist.query.join (Artist.albums) .filter_by (genre_id = genre.id) .all ()'? – danidee

+0

물론 오타가 수정되었습니다. 고마워요! – Dauros

관련 문제