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 个可选 过滤器。

  1. Artist.name
  2. Song.title
  3. SongDictionary.word
  4. 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()