我正在努力寻找一个好的解决方案,以避免在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配置该模型以加载歌曲。但就我而言,获取所有歌曲非常昂贵,我想避免这样做。这可能吗?如果可以,怎么办?