数据库操作
更新时间: 2025/07/05
在Gitcode上查看源码接口说明
使用Statement对象操作数据库
使用db:select, db:insert, db:update, db:delete方法可以创建Statement对象
:first()
描述
- 通过
db:select(Table对象):first()查询符合条件的第一条数据
参数
- 无
返回
- 数据存在时返回row对象,可以直接通过
.字段名获取字段值 - 数据不存在时返回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对象执行回调。
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| cb | function | 回调函数 | 必选 |
| 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(列对象, 是否降序),默认是升序(从小到大),可以按多个列排序。
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| filed | table | 列对象 | 必选 |
| is_desc | boolean | 是否降序 | 可选 |
返回
- 排序后的查询结果
异常
- 无
示例
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方法配合使用
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| limit | integer | 截取条数 | 必选 |
| offset | integer | 跳过条数 | 可选 |
返回
- 截取后的查询结果
异常
- 无
示例
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不能单独使用。
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| n | integer | 跳过条数 | 必选 |
返回
- 截取后的查询结果
异常
- 若单独使用offset(无limit),将抛异常
示例
lua
-- 查询Id排列第3到第5的用户
local users = db:select(db.Account):order_by(db.Account.Id):limit(3):offset(2):all():insert(table)
描述 插入数据
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| table | table | 待插入数据的表 | 必选 |
返回
- 无
异常
- 无
示例
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)
描述 更改数据
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| table | table | 待更改数据的表 | 必选 |
返回
- 无
异常
- 无
示例
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()
描述 删除数据
参数
| 参数 | 类型 | 描述 | 是否必选 |
|---|---|---|---|
| table | table | 待删除数据的表 | 必选 |
返回
- 无
异常
- 无
示例
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占用率升高