python - SqlAlchemy 中的 order_by Levenshtein 距离
问题描述
我想在用于搜索的端点返回的一组(小)行上 order_by Levenshtein distance。我的设置:
- 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 超出了我的预期。正确的语法是:
q = (
db.query(Model)
.options(joinedload(Model.child2s), joinedload(Model.children))
.filter(Model.children.has(id=12345))
.order_by(func.levenshtein(Model.name, 'SomeString'))
)
推荐阅读
- wpml - 为什么 WPML 在保存后会创建多个文件条目
- list - Flutter Dart Map 更新一个键的多个值
- applescript - Applescript 创建具有属性的文件夹
- google-cloud-platform - GCLB Url Map 中的正则表达式
- keras - Tensorflow2.4 使用自定义训练循环和镜像策略恢复训练
- html - 如何将 div 背景颜色居中在另一个标签中
- ruby-on-rails-5 - 奇怪的 Rails 迁移行为 - 重复 add_references 命令并因 ActiveRecord::StatementInvalid: PG::DuplicateColumn 而失败
- reactjs - 如何在反应中访问数组值?
- python - Django AllAuth URL 模式配置
- javascript - 如何从打字稿中的数组生成键值对对象