当前位置: 首页 > 面试题库 >

如何查询多对多SQLAlchemy

支洋
2023-03-14
问题内容

首先导入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。并且该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')) 

所以我们有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()

以及Artists链接到Album:

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

现在,我想查询ArtistsGenre传genre.id 链接的所有链接。如何实现呢?


问题答案:

你可以在中应用过滤器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()


 类似资料:
  • 问题内容: 我遇到了麻烦。 有一个实体发行人与与实体镇的ManyToMany关系有关: 那么实体镇也与地区有关 现在,我必须过滤(使用jpql)一个区域中的所有分发服务器。我能怎么做? 问题答案: 请参阅:https://en.wikibooks.org/wiki/Java_Persistence/JPQL

  • 我正在读MongoDB在行动这本书。我有一个关于的问题。 在中,该书给出了一个多对多关系的示例。它给出了文档和文档。 我理解这里的多对多关联。基本上,可以有一个带有_id等数组的键。所以我不想问类似MongoDB多对多关联的问题 我的问题是关于的,书中给出了关于查询多对多关系的两个示例查询。下面是两个查询: > 是什么意思?我以为只存在于Ruby驱动程序中。 中的是什么?是收藏吗? 中的是什么?

  • 主要内容:示例实际应用中,由于多对多的关系比较复杂,会增加理解和关联的复杂度,所以应用较少。MyBatis 没有实现多对多级联,推荐通过两个一对多级联替换多对多级联,以降低关系的复杂度,简化程序。 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系。可以使用一个中间表(订单记录表)将多对多级联转换成两个一对多的关系。 示例 下面以订单和商品(实现“查询所有订单以及每个订单对应

  • 我有三个具有多对多关系的mysql表,我正在尝试在spring boot上进行Jpa查询。这些表是 带有字段id、名称的产品 附加字段id,名称 product_extra字段id、product_id、extra_id Product table与extra table有多对多关系,因为一个产品可以有许多extra,因此需要Product\u extra table 这是我想在我的项目中包含的查

  • 我试图让api返回一个注释列表,通过与标签的多对多关系关联,给定一个标签ID。Spring boot自动创建了一个名为notes_tables的桥接表,其中包含一个notes_id字段和一个labels_id字段。Spring Boot还创建了一个notes表和一个labels表。我尝试了以下步骤: 我只需要让它工作,但我特别好奇我是否能让它与jpa方法查询一起工作。任何查询都可以,只要它可以工作

  • 我需要以下场景的SQL查询。 @ManyToOne@JoinColumn(name=“PRODUCT_ID”)私有产品产品; 但我没有在产品中指定一个。