Lapis快速分页查询

1.4k 词

作者:糖果

Lapis分页查询和一般的Django分页查询有明显的分别:

lapis分页器对象的创建和查询条件的指定是同时的。

local lapis = require "lapis"
local app = lapis.Application()
local config = require("lapis.config")

local db = require("lapis.db")
local Model = require("lapis.db.model").Model
local schema = require ("lapis.db.schema")

app:get("/",
function(self)
   
    local Cmt = Model:extend("user")
    local paginated = Cmt:paginated("where id <= ?" , 100, { per_page = 10,
        prepare_results = function(posts)
        return posts
    end

    local page1 = paginated:get_page(1)
end
)

不像Django,Lapis不需要定义表的结构类,一句就可以解决这个问题:

local Cmt = Model:extend("user")

接下来就是定义分页模式, 查询条件是id<=100, 10行分一页:

local paginated = Cmt:paginated("where id <= ?" , 100, { per_page = 10,
    prepare_results = function(posts)
    return posts
end

查询第一分页数据:

local page1 = paginated:get_page(1)

lapis分页接口这样设计是可以接受的:

看一下Python的接口设计:

def listing(request):
        words_list = Author.objects.order_by('-dateTime')[:100]
        paginator = Paginator(words_list, 16)
        page = request.GET.get('page')

        try:
                contacts = paginator.page(page)
        except PageNotAnInteger:
                contacts = paginator.page(1)
        except EmptyPage:
                contacts = paginator.page(paginator.num_pages)

        t = loader.get_template('tests/list.html')

        c = RequestContext(request, {
                'words_list':contacts,
        })
        return HttpResponse(t.render(c))

把直接从Model里取出的数据全集,直接给分页器,当分页器持有这些数据后,通过自己的接口,来操作返回分页的数据结果。

在Django中,第一次正常的查询动作和分页动作执行是分开的,先按条件查询,返回所有数据集合,然后,再作为入参给分页器对像。

而Lapis的方式是二和一的,赋予查询条件查询和返回结果给分页,是一个动作,model和分页器,不是两个数据结构,是一个对象控制的,这是好还是不好呢?各有好处!

www.lua.ren