首先导入Flask
和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)
有三张表:Artist
、Album
和 Genre
,Artist
对象可以链接到多个 Albums
,而 Album
对象也可以链接到多个 Artists
。为了保持 Artists
和 Albums
之间的关系紧密,需要使用 albums_to_artists_table
表格来维护它们之间的关系:
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'))
因此,我们将艺术家
链接到专辑
,专辑
链接到流派
,看起来像这样:艺术家
> 专辑
> 流派
。
有了这个设置,我们首先创建流派
对象:
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()
数据库创建后,我们可以查询与 Genre 相关联的
Albums :
<code><code>print Album.query.filter_by(genre_id=1).all()
</code></code>
哪些
艺术家
与专辑
相关:
<code><code>print Artist.query.filter(Artist._albums.any(id=album1.id)).all()
</code></code>
现在我想查询所有与通过genre.id链接的
Genre
相关的Artists
。如何实现?