gpt4 book ai didi

python - SqlAlchemy 中的 order_by Levenshtein 距离

转载 作者:行者123 更新时间:2023-12-05 02:47:33 25 4
gpt4 key购买 nike

我想对用于搜索的端点返回的一组(小)行进行 order_by Levenshtein 距离。我的设置:

  • sqlalchemy=='1.3.19'
  • Postgres 引擎 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 是我根据传入请求的参数应用于查询的连接/过滤操作列表之一,所以 model 表的别名不会在运行时被知道。是否有使用 Postgres Levenshtein 函数进行排序的好方法?

最佳答案

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

from sqlalchemy import func  # this holds the levenshtein() function

# ... omitted ...

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

关于python - SqlAlchemy 中的 order_by Levenshtein 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64949921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com