在SqlAlchemy中按Levenshtein距离排序

3

我希望能在一个用于搜索的端点返回的(较小)行集上按Levenshtein距离进行排序。我的设置如下:

  • sqlalchemy=='1.3.19'
  • Postgres Engine 11.3

我使用Model尝试了以下方法:

class Model(Base):
    id = Column(...)
    name = Column(...)


class Child(Column):
    id = Column(...)
    model_id = Column(...)
    model = relationship("Model", backref='children', ...)


class Child2(Column):
    id = Column(...)
    model_id = Column(...)
    model = relationship("Model", backref='child2s', ...)


db: Session = get_session()
q = (
    db.query(Model)
    .options(joinedload(Model.child2s), joinedload(Model.children))
    .filter(Model.children.has(id=12345))
    .order_by(text("LEVENSHTEIN(model.name, 'SomeString')")) <<< this is what caused an error
)

res = q.all()

这里是错误信息:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) missing FROM-clause entry for table "model"

这个失败是因为 joinedload 选项引入了一个别名到我的模型中,使得 model.name 现在被命名为 anon_1_model_name。由于 order_by 是我基于传入请求参数应用到查询的一系列 join/filter 操作之一,因此在运行时将不知道 model 表的别名。是否有一种好的方法来使用 PostgreSQL 的 Levenshtein 函数进行排序?

1个回答

4

像往常一样,SqlAlchemy又超出了我的期望。正确的语法是:

q = (
    db.query(Model)
    .options(joinedload(Model.child2s), joinedload(Model.children))
    .filter(Model.children.has(id=12345))
    .order_by(func.levenshtein(Model.name, 'SomeString'))
)

2
嗨!func.levenshtein 的导入是什么? - SidoShiro92
从SQLAlchemy导入func的@SidoShiro92 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接