【问题标题】:How to query Many-To-Many SQLAlchemy如何查询多对多 SQLAlchemy
【发布时间】:2017-04-03 15:16:22
【问题描述】:

首先导入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)

共有三个表:ArtistAlbumGenreArtist 对象可以链接到多个Albums。并且Album 对象可以链接到多个Artistsalbums_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')) 

所以我们将Artist 链接到Album 链接到Genre,它看起来像这样: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()

以及ArtistsAlbum 相关联的内容:

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

现在我想查询所有与Genre 相关联的Artists,并传递了genre.id。如何实现?

【问题讨论】:

  • hmmm,你的关系对我来说似乎不合适....根据你目前的关系,一张专辑只能有一种流派,这意味着艺术家要与 x 流派相关联,他必须还有x张专辑....这是你想要的吗?
  • 是的,专辑和流派是一对一的关系。
  • 根据上面的例子,我如何查询拥有超过 1 张专辑的艺术家?

标签: python flask sqlalchemy


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2021-01-30
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多