【问题标题】:How do i override LIMIT and OFFSET in Peewee?如何在 Peewee 中覆盖 LIMIT 和 OFFSET?
【发布时间】:2018-05-12 04:47:46
【问题描述】:

我正在尝试为 Peewee for SQL Server 构建数据库驱动程序(通过 SQL 中继)。由于 SQL Server 不像其他数据库那样支持 LIMIT 语法,因此我需要覆盖它。我相信 SQL Server 的正确语法类似于:

SELECT TOP(1) FROM users 

TOP 替换 LIMIT 用于只需要返回找到的结果子集的查询。

另一方面,在 SQL Server 中,对结果分页的支持是通过以下方式完成的:

SELECT email FROM emailTable 
WHERE id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

OFFSET <X> ROWS 替换 OFFSETFETCH NEXT… 替换 LIMIT

我还发现了一个旧的尝试来实现对 Peewee 的 SQL Server 支持,但它看起来非常过时,因为我在当前的 Peewee 代码库中没有看到任何关于“查询编译器”的信息。

https://github.com/COUR4G3/peewee-mssql/blob/master/peewee_mssql.py

在 Peewee 中自定义 LIMITOFFSET 的查询参数的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: sql-server python-3.x peewee


    【解决方案1】:

    TOP 看起来像一个 SQL 函数,所以你可以使用 Peewee 的 sql function helper (fn):

    fn.TOP(10)
    

    对于接下来的偏移量/获取,您可能需要进行相当深入的管理... Peewee 3.x 包含对查询构建器和 SQL 生成代码的完全重写,以及对所有 AST 的重写节点类。

    理论上,您可以继承 Select 并覆盖 _apply_ordering() 方法,但它可能会很复杂并且不能完全正确地工作。

    要创建自定义子句,您可能会执行以下操作:

    ctx = super(Select, self)._apply_ordering(ctx)
    return (ctx
            .literal('OFFSET ')
            .sql(10)
            .literal(' ROWS FETCH NEXT ')
            .sql(10)
            .literal(' ROWS ONLY'))
    

    或者使用 NodeList:

     order = NodeList((
         SQL('OFFSET'),
         Value(10),
         SQL(' ROWS FETCH NEXT '),
         Value(10),
         SQL(' ROWS ONLY'))
     ctx = ctx.sql(order)
    

    编辑:我添加了一个实验性补丁,可以让您了解如何执行此操作。您需要覆盖数据库类的“get_context_options()”方法,以便它提供正确的功能标志(“limit_fetch_syntax=True”)。希望这会有所帮助:

    https://github.com/coleifer/peewee/compare/limit-fetch-first?expand=1#diff-eb0556c6b1b9232ba053c4cea13ff075

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2011-07-27
      • 2020-08-19
      • 2012-08-25
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多