【问题标题】:Using greater than (>=) or less than (<=) operators in SQlAlchemy [duplicate]在 SQLAlchemy 中使用大于 (>=) 或小于 (<=) 运算符 [重复]
【发布时间】:2017-09-28 00:56:28
【问题描述】:

我正在尝试向 Web 应用程序添加一项功能,其中在通过 JavaScript 和 SQLAlchemy 拖动地图时坐标将自动更新。但是我的数据库查询更新路由时出现错误。这是我的查询。

if sw_lng <= ne_lng:

# doesn't cross the antimeridian
rows = City.query.filter(sw_lat <= City.latitude and City.latitude <= ne_lat and (sw_lng <= City.longitude and City.longitude <= ne_lng)
                         ).group_by(City.country_code, City.city_name, City.region
                                    ).order_by(func.random()).limit(10)

这里是相关的错误信息:

raise TypeError("Boolean value of this clause is not defined")

TypeError: Boolean value of this clause is not defined

任何帮助将不胜感激。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    不要使用and 组合过滤器,将每个过滤器表达式作为单独的参数传递(默认行为是将它们视为and-ed 一起)。使用and 本身是在尝试执行本地布尔测试(Python 有充分的理由不允许任何形式的重载会改变and 的含义),但是 SQLAlchemy 将测试用作它的专用对象延迟评估以在查询调度时生成 SQL 查询(将工作推送到数据库服务器)。你想要:

    rows = City.query.filter(sw_lat <= City.latitude, City.latitude <= ne_lat,
                             sw_lng <= City.longitude, City.longitude <= ne_lng)...cont....
    

    【讨论】:

    • 感谢您的帮助,解决了该错误。但是我的最终目标是使用 jsonify 将 JSON 对象返回到客户端。
    • 这是我尝试这样做时遇到的新错误 o.__class__.__name__) TypeError: Object of type 'BaseQuery' is not JSON serializable
    • @aharding378:这是一个完全不同的问题,您没有提供触发错误的代码。听起来您正在尝试返回查询对象本身,而不是将查询解析为实际行,但我不能确定。搜索以查看是否已回答,如果没有,请提出新问题。
    猜你喜欢
    • 2019-12-07
    • 2021-11-05
    • 2012-10-14
    • 2018-07-28
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多