[英]order_by Levenshtein Distance in SqlAlchemy
我想对由用于搜索的端点返回的一组(小)行进行 order_by Levenshtein 距离。 我的设置:
我对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 超出了我的预期。 正确的语法是:
q = (
db.query(Model)
.options(joinedload(Model.child2s), joinedload(Model.children))
.filter(Model.children.has(id=12345))
.order_by(func.levenshtein(Model.name, 'SomeString'))
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.