【问题标题】:SQL alchemy case insensitive sort orderSQLalchemy 不区分大小写的排序顺序
【发布时间】:2023-04-10 03:46:01
【问题描述】:

您好,我正在尝试使用 sql alchemy 为 sqlite 数据库中的特定列实现升序排序,我遇到的问题是我要排序的列有大写和小写数据,因此排序顺序没有正常工作。

然后我发现了 func.lower 并尝试将其合并到查询中,但它要么错误要么不起作用,有人可以给我一个工作示例,说明如何使用 sql alchemy 执行不区分大小写的升序排序.

以下是我目前所拥有的(抛出错误):-

session.query(ResultsDBHistory).order_by(func.lower(asc(history_sort_order_column))).all()

python 2.6.6 sql炼金术0.7.10

【问题讨论】:

    标签: python sqlite sqlalchemy


    【解决方案1】:

    您需要颠倒函数的顺序:

    session.query(ResultsDBHistory).order_by(asc(func.lower(history_sort_order_column))).all()
    

    所以先降,再声明升序。

    或者,将排序规则更改为NOCASE

    from sqlalchemy.sql import collate
    
    session.query(ResultsDBHistory).order_by(asc(collate(history_sort_order_column, 'NOCASE'))).all()
    

    无论如何,这可以说是一个更好的主意。

    我不认为 ASC 是必需的,不使用它会在一定程度上简化您的代码:

    from sqlalchemy.sql import collate
    
    session.query(ResultsDBHistory).order_by(collate(history_sort_order_column, 'NOCASE')).all()
    

    【讨论】:

    • 嗯,我无法让它工作,只要我使用 collat​​e 或 func.lower,它就会完全停止排序顺序,只是默认按 id 排序。我可以让它工作的唯一方法是直接在数据库上将我有问题的列的排序规则设置为 NOCASE,然后忽略尝试进行不区分大小写的查询,关于为什么这可能不起作用的任何想法?
    • 可能需要为排序顺序创建索引:CREATE INDEX ResultsDBHistory ON tablename (history_sort_order_column COLLATE NOCASE)
    • 不,索引将有助于加快速度,但排序规则仍然有效,请参阅 sqlite.org/datatype3.html#collation
    • 我现在为我想要的表和我遇到问题的列创建了一个索引,但我仍然得到相同的结果,一旦我指定 nocase 或 func.lower,它就会停止排序跨度>
    • 尝试在sqlite命令行only中重新创建情况。它在那里工作吗?那么也许我们在这里有一个 SQLAlchemy 或 python sqlite3 版本问题。但如果它在命令行中也不起作用..
    【解决方案2】:

    你有没有想过在查询之后进行排序。

    res = session.query(ResultsDBHistory).all()
    res.sort()  #sort as the way you like
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2012-08-16
      • 2019-01-31
      • 2020-09-13
      • 2012-06-22
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多