Construindo dinamicamente filtros no SQLAlchemy

Eu estou procurando uma maneira de construir dinamicamente filtros usando o SQLAlchemy. Ou seja, dada a coluna, o nome do operador e o valor de comparação, construa o filtro correspondente.

Vou tentar ilustrar usando um exemplo (isso seria usado para construir uma API). Vamos supor que temos o seguinte modelo:

class Cat(Model):

  id = Column(Integer, primary_key=True)
  name = Column(String)
  age = Column(Integer)

Gostaria de mapear consultas para filtros. Por exemplo,

/cats?filter=age;eq;3 deve gerarCat.query.filter(Cat.age == 3)

/cats?filter=age;in;5,6,7&filter=id;ge;10 deve gerarCat.query.filter(Cat.age.in_([5, 6, 7])).filter(Cat.id >= 10)

Olhei em volta para ver como isso foi feito, mas não consegui encontrar uma maneira que não envolvesse mapear manualmente cada nome de operador para um comparador ou algo semelhante. Por exemplo,Frasco-inquieto mantém um dicionário de todas as operações suportadas e armazena as funções lambda correspondentes (codifique aqui).

Procurei nos documentos do SQLAlchemy e encontrei dois leads potenciais, mas nenhum dos dois pareceu satisfatório:

usandoColumn.like, Column.in_...: esses operadores estão disponíveis diretamente na coluna, o que tornaria simples o usogetattr mas alguns ainda estão faltando (==, >, etc.).

usandoColumn.op: por exemplo.Cat.name.op('=')('Hobbes') mas isso não parece funcionar para todos os operadores (in nomeadamente).

Existe uma maneira limpa de fazer isso semlambda funções?

questionAnswers(3)

yourAnswerToTheQuestion