数据库操作
更新时间: 2025/07/05
在Gitcode上查看源码

接口说明

使用Statement对象操作数据库

使用db:select, db:insert, db:update, db:delete方法可以创建Statement对象

:first()

描述

  • 通过db:select(Table对象):first()查询符合条件的第一条数据

参数

返回

  1. 数据存在时返回row对象,可以直接通过.字段名获取字段值
  2. 数据不存在时返回nil

异常

示例

lua
local user1 = db:select(db.Account):where(db.Account.Id:eq(1)):first()

print(user1.UserName) -- name1

:all()

描述

  • 通过db:select(Table对象):all()查询所有符合条件的数据

参数

返回

  • row对象数组(数据不存在时为空)

异常

示例

lua
local users = db:select(db.Account):all()

print(#users) -- 2
print(users[1].UserName) -- name1
print(users[2].UserName) -- name2

:fold(cb, acc)

描述

  • 通过db:select(Table对象):fold(回调函数)对查询到的所有row对象执行回调。

参数

参数类型描述是否必选
cbfunction回调函数必选
acc无明确限制累加器初始值可选

返回

  • 回调函数执行结果,即 acc 的最终值

异常

示例

lua
local users = {}

db:select(db.Account):fold(function(user)
    print(user.UserName)
    users[#users + 1] = user
end)

:order_by(filed, is_desc)

描述

  • 对查询结果进行排序,使用方式为:order_by(列对象, 是否降序),默认是升序(从小到大),可以按多个列排序。

参数

参数类型描述是否必选
filedtable列对象必选
is_descboolean是否降序可选

返回

  • 排序后的查询结果

异常

示例

lua
-- 按用户Id升序、用户名降序排序
local users = db:select(db.Account):order_by(db.Account.Id):order_by(db.Account.UserName, true):all()

:limit(limit, offset)

描述

  • 对查询结果进行截取(跳过offset条数据之后截取前limit条),可单独使用,可也与offset方法配合使用

参数

参数类型描述是否必选
limitinteger截取条数必选
offsetinteger跳过条数可选

返回

  • 截取后的查询结果

异常

示例

lua
-- 查询Id排列第3到第5的用户
local users = db:select(db.Account):order_by(db.Account.Id):limit(3):offset(2):all()

:offset(n)

描述

  • 跳过x条数据之后截取前y条:limit(y):offset(x),limit必须在offset前面。limit可以单独使用,offset不能单独使用。

参数

参数类型描述是否必选
ninteger跳过条数必选

返回

  • 截取后的查询结果

异常

  • 若单独使用offset(无limit),将抛异常

示例

lua
-- 查询Id排列第3到第5的用户
local users = db:select(db.Account):order_by(db.Account.Id):limit(3):offset(2):all()

:insert(table)

描述 插入数据

参数

参数类型描述是否必选
tabletable待插入数据的表必选

返回

异常

示例

lua
-- 插入一条数据
db:insert(db.Account):value({Id = 3, UserName = 'name3'}):exec()
-- 插入多条数据
local users = {
    {Id = 3, UserName = 'name3'},
    {Id = 4, UserName = 'name4'}
}
db:insert(db.Account):values(users):exec()

:update(table)

描述 更改数据

参数

参数类型描述是否必选
tabletable待更改数据的表必选

返回

异常

示例

lua
-- 将Id为1的用户名称改为new_name
db:update(db.Account):value({UserName = 'new_name'}):where({Id = 1}):exec()
-- 将所有用户名称改为abc
db:update(db.Account):value({UserName = 'abc'}):exec()

:delete()

描述 删除数据

参数

参数类型描述是否必选
tabletable待删除数据的表必选

返回

异常

示例

lua
-- 删除Id为1的用户
db:delete(db.Account):where({Id = 1}):exec()
-- 删除所有用户
db:delete(db.Account):exec()

:where(...)

描述 通过调用Statement对象的:where()方法可以添加条件。支持字典模式、数组模式和Condition模式。

参数

  • {字段名 = 字段值}形式的Lua表,或者一个或多个Condition对象,具体见示例

返回

异常

示例

  • 字典模式

where方法传入{字段名 = 字段值}形式的Lua表,表示数据需要与传入的所有字段值匹配。

lua
local users = db:select(db.Account):where({UserName = 'name1'}):all() -- 查询所有UserName为name1的用户

db:delete(db.Account):where({Id = 1, UserName = 'name1'}):exec() -- 删除所有Id为1, UserName为name1的用户
  • 数组模式

where方法传入{字段名, 字段值}数组形式的Lua表,表示数据需要与传入的所有字段值匹配。

lua
local users = db:select(db.Account):where({{'UserName', 'name1'}}):all() -- 查询所有UserName为name1的用户

db:delete(db.Account):where({{'Id', 1}, {'UserName', 'name1'}}):exec() -- 删除所有Id为1, UserName为name1的用户
  • Condition模式

where方法传入一个或多个Condition对象,表示数据需要满足所有传入的条件。

方法sql操作符含义
Field:eq(value)=等于
Field:ne(value)!=不等于
Field:lt(value)<小于
Field:le(value)<=小于等于
Field:gt(value)>大于
Field:ge(value)>=大于等于
Field:like(value)LIKE模糊查询
Field:in_(...)IN匹配多个值
or_(...)OR
lua
local statement = require 'database.statement'
local or_ = statement.or_
-- 将Id为1的用户名称修改为new_name: UPDATE t_account SET UserName='new_name' WHERE Id=1
local users = db:update(db.Account):value({UserName = 'new_name'}):where(db.Account.UserName:eq('name1')):exec()
-- 查询Id在2和5之间的用户: SELECT * FROM t_account WHERE Id >= 2 AND Id <= 5
local users = db:select(db.Account):where(db.Account.Id:ge(2), db.Account.Id:le(5)):all()
-- 查询Id为1,3,5的用户: SELECT * FROM t_account WHERE Id IN (1, 3, 5)
local users = db:select(db.Account):where(db.Account.Id:in_(1, 3, 5)):all()
-- 删除UserName以name开头或者Id大于3的用户: DELETE FROM t_account WHERE UserName LIKE 'name%' OR Id > 3
db:delete(db.Account):where(or_(db.Account.UserName:like('name%'), db.Account.Id:gt(3))):exec()

注意: 使用:like()进行模糊匹配时,如果数据量庞大(超过上万条)可能会耗时较长,并且导致CPU占用率升高