我正在尝试进行搜索,通过生成器将几个不同的音节传递给“and_”函数。然后,我的搜索应返回所有且仅返回所有已给出音节的单词
匹配 = db.session.query(Word).join(Word.syllables).filter(db.and_(Syllable.syllable==(syl for syl in combo)))).all()
这目前不返回任何内容。这种方法甚至有意义吗?
我正在尝试进行搜索,通过生成器将几个不同的音节传递给“and_”函数。然后,我的搜索应返回所有且仅返回所有已给出音节的单词
匹配 = db.session.query(Word).join(Word.syllables).filter(db.and_(Syllable.syllable==(syl for syl in combo)))).all()
这目前不返回任何内容。这种方法甚至有意义吗?
我不认为这个查询会做你想要的。对于 combo = (1, 2),您生成的查询将是这样的:
SELECT words.* FROM words INNER JOIN syllables ON words.id = syllables.word_id WHERE syllables.syllable = 1 AND syllables.syllable = 2
我认为你想要的是组合 = (1, 2):
SELECT words.* FROM words INNER JOIN syllables AS s1 ON words.id = s1.word_id AND s1.syllable = 1 INNER JOIN syllables AS s2 ON words.id = s2.word_id AND s2.syllable = 2
重复加入可能会变慢,但这是在 sqlalchemy 中执行此操作的方法:
query = db.session.query(Word)
for syl in combo:
syl_cls = aliased(Syllable)
query = query.join(syl_cls, Word.syllables).filter(syl_cls.syllable == syl)
matches = query.all()
如果您正在生成 OR 子句,那么这个查询会简单得多。