通过多对多关系追加时,如何不在SQLAlchemy中加载子级?

时间:2019-02-05 13:41:36

标签: python orm sqlalchemy flask-sqlalchemy

我正在努力寻找一个好的解决方案,以避免在Flask-SQLAlchemy中通过多对多关系追加新链接时避免加载子对象。

我已经定义了一种以这种方式将艺术家和歌曲链接起来的模型(简化):

links = db.Table('links',
    db.Column('artist_id', db.Integer, db.ForeignKey('artists.id'), primary_key=True),
    db.Column('song_id', db.Integer, db.ForeignKey('songs.id'), primary_key=True))

class Artist(db.Model):
    __tablename__ = "artists"
    id = db.Column(db.Integer, primary_key=True)
    songs = db.relationship('Song', secondary=links, lazy=True, backref=db.backref('artists', lazy=True))

class Song(db.Model):
    __tablename__ = "songs"
    id = db.Column(db.Integer, primary_key=True)

对我来说,创建新链接的通常方法是使用诸如以下的append方法:

new_artist = Artist()
new_song = Song()
new_artist.songs.append(new_song)

当我回显此类追加的SQL查询时,我注意到,只要调用new_artist.songs.append(new_song),ORM就会提取所有歌曲(例如,针对艺术家ID 12的歌曲),然后将链接插入到关联表(例如,歌曲ID 500):

SELECT songs.id AS songs_id
FROM songs, links
WHERE 12 = links.artist_id AND songs.id = links.songs_id

INSERT INTO links (song_id, artist_id) VALUES (500, 12)

我想知道是否可以跳过这两个SQL命令中的第一个,或者是否需要此功能。以我的理解,只要我通过artist.songs引用它们,就可以通过lazy = True配置该模型以加载歌曲。但就我而言,获取所有歌曲非常昂贵,我想避免这样做。这可能吗?如果可以,怎么办?

0 个答案:

没有答案