SQLAlchemy 加入可选参数
SQLAlchemy Join with optional parameters
我在 Python 的 SQLAlchemy 中得到以下查询:
db_data = session.query(Artist.name.label("artist"), Song.title.label("song_title"),
SongDictionary.word, SongDictionary.count.label("word_count"),
SongDictionary.word_type, SongDictionary.word_length).join(
Song, Song.artist_id == Artist.id).join(SongDictionary, SongDictionary.song_id ==
Song.id).all()
现在我想添加 4 个可选 过滤器。
- Artist.name
- Song.title
- SongDictionary.word
- SongDictionary.word长度
我不想对每个可能的参数都使用 if 条件,并在参数是否为 None 时更改查询。
所以我阅读了有关通过 **kwargs 传递参数并使用 filter_by 而不是过滤器的信息。
我这样试过:
kwargs = {}
if filter_artist: kwargs["Artist.name"] = filter_artist
if filter_song: kwargs["Song.title"] = filter_song
if filter_word: kwargs["SongDictionary.word"] = filter_word
if filter_wordlength: kwargs["SongDictionary.length"] = filter_wordlength
在 .all()
之前添加了 filter_by(**kwargs)
但是当我试图通过 **kwargs 传递参数时,似乎我必须将参数直接放在 table 的连接后面才能访问此 table 的列。所以我必须创建 3 个过滤器变量。
也将是一个机会,但我也无法 filter_by 艺术家 table 在我的情况下。
我相信一定有更好的方法。
谢谢!
知道了..在这里找到了帮助
在我的例子中,我创建了一个参数列表并将该参数传递给过滤器。
args = []
if filter_artist: args.append(Artist.name.like("%%%s%%" % filter_artist))
if filter_song: args.append(Song.title.like("%%%s%%" % filter_song))
if filter_word: args.append(SongDictionary.word.like("%%%s%%" % filter_word))
if filter_wordlength: args.append(SongDictionary.word_length == filter_wordlength)
将此参数添加到查询中,它按我的预期工作。
db_data = session.query(Artist.name.label("artist"), Song.title.label("song_title"), SongDictionary.word,
SongDictionary.count.label("word_count"), SongDictionary.word_type,
SongDictionary.word_length).join(Song, Song.artist_id ==
Artist.id).join(SongDictionary, SongDictionary.song_id == Song.id).filter(*args).all()
我在 Python 的 SQLAlchemy 中得到以下查询:
db_data = session.query(Artist.name.label("artist"), Song.title.label("song_title"),
SongDictionary.word, SongDictionary.count.label("word_count"),
SongDictionary.word_type, SongDictionary.word_length).join(
Song, Song.artist_id == Artist.id).join(SongDictionary, SongDictionary.song_id ==
Song.id).all()
现在我想添加 4 个可选 过滤器。
- Artist.name
- Song.title
- SongDictionary.word
- SongDictionary.word长度
我不想对每个可能的参数都使用 if 条件,并在参数是否为 None 时更改查询。
所以我阅读了有关通过 **kwargs 传递参数并使用 filter_by 而不是过滤器的信息。
我这样试过:
kwargs = {}
if filter_artist: kwargs["Artist.name"] = filter_artist
if filter_song: kwargs["Song.title"] = filter_song
if filter_word: kwargs["SongDictionary.word"] = filter_word
if filter_wordlength: kwargs["SongDictionary.length"] = filter_wordlength
在 .all()
之前添加了 filter_by(**kwargs)但是当我试图通过 **kwargs 传递参数时,似乎我必须将参数直接放在 table 的连接后面才能访问此 table 的列。所以我必须创建 3 个过滤器变量。 也将是一个机会,但我也无法 filter_by 艺术家 table 在我的情况下。
我相信一定有更好的方法。 谢谢!
知道了..在这里找到了帮助
在我的例子中,我创建了一个参数列表并将该参数传递给过滤器。
args = []
if filter_artist: args.append(Artist.name.like("%%%s%%" % filter_artist))
if filter_song: args.append(Song.title.like("%%%s%%" % filter_song))
if filter_word: args.append(SongDictionary.word.like("%%%s%%" % filter_word))
if filter_wordlength: args.append(SongDictionary.word_length == filter_wordlength)
将此参数添加到查询中,它按我的预期工作。
db_data = session.query(Artist.name.label("artist"), Song.title.label("song_title"), SongDictionary.word,
SongDictionary.count.label("word_count"), SongDictionary.word_type,
SongDictionary.word_length).join(Song, Song.artist_id ==
Artist.id).join(SongDictionary, SongDictionary.song_id == Song.id).filter(*args).all()