lua操作数据库

项目中C对lua只开放了C_updateColumn用于写,C_selectDb用于读。想要把直接一个lua table映射更新到一张数据库表比较烦。

于是写了以下这些函数方便操作。

---一些操作数据库用的工具函数
--@author lqk
Database = {}


---生成update需要的a=11,b=22
function Database.colValueSet(colValue)
	local str = ""
	local substr = ""
	local bf = false
	for k,v in pairs(colValue) do
		if type(v) ~= "table" then
			k = "`"..k.."`"
			if type(v) == "string" then
				v = "'"..v.."'"
			end
		
			substr = k.."="..v
			if bf == false then
				str = str..substr
				bf = true
			else
				str = str..","..substr
			end
		end
	end
	return str
end

---返回插入数据库所需要的一些参数
--@return col 列名
--@return value 值
--@return tcol blob列
function Database.colValueInsert(colValue)
	local col = ""
	local value = ""
	local tcol = {}
	local bf = false
	local kblob
	for k,v in pairs(colValue) do
		kblob = k
		k = "`"..k.."`"
		if type(v) == "string" then
			v = "'"..v.."'"
		end
		
		if type(v) ~= "table" then
			substr = k.."="..v
			if bf == false then
				col = tostring(k)
				value = tostring(v)
				bf = true
			else
				col = col..","..k
				value = value..","..v
			end
		else
			table.insert(tcol, kblob)
		end
	end
	return col, value, tcol
end

---直接插入数据库
--@param t 表名
--@param data 要存到数据库的内容,是lua 中的table,key是 数据库中的列名。
--@return aid,如果失败返回false
function Database.insert(t, data)
	local sql
	local enSuc, enData
	--普通字段
	local col, value, tcol = Database.colValueInsert(data)
	sql = "insert into " .. t .. " (".. col ..") value(".. value ..")"
	enSuc, enData = C_updateDb(sql)
	if enSuc == false then
		return false
	end
	--aid
	sql = "SELECT LAST_INSERT_ID() as aid"
	enSuc, enData = C_selectDb(sql)
	if enSuc == false then
		--TODO ERROR
		return false
	end
	local aid = enData[1].aid
	--blob
	if table.getn(tcol) > 0 then
		enSuc, enData = C_updateColumn(t, tcol, data, "aid=" .. aid)
		if enSuc == false then
			C_errorLog(space("Database.insert", t, tcol[1], aid))
			return false
		end
	end
	return aid
end

---获取数据库的多列
--@param t 表名
--@param aid 记录aid
--@param columns 列名字符串组成的数组
--@return key是列名的table
function Database.getColumns(t, aid, columns)
	if t == nil or aid == nil or columns == nil then
		return false
	end
	
	if table.maxn(columns) == 0 then
		return false
	end
	
	local data = {}
	local sql = "select "
	for k, v in pairs(columns) do
		sql = sql..v..","
	end
	sql = string.sub(sql, 1, -2)
	
	sql = sql.." from "..t
	sql = sql.." where aid="..aid
	local enSuc, enData = C_selectDb(sql)
	if enSuc == false then
		return false
	end
	
	return enData[1]
end

function Database.getColumn(t, aid, column)
	local columns = {}
	table.insert(columns, column)
	local data = Database.getColumns(t, aid, columns)
	if data == false then
		return false
	end
	return data[column]
end

---直接插入数据库
--@param t 表名
--@param data 要存到数据库的内容,是lua 中的table,key是 数据库中的列名。
--@return aid,如果失败返回false
function Database.setColumns(t, aid, data)
	if t == nil or aid == nil or data == nil then
		return false
	end
	
	local sql
	local enSuc, enData
	
	--普通字段
	local col, value, tcol = Database.colValueInsert(data)
	local cvStr = Database.colValueSet(data)
	sql = "update "..t.." set "..cvStr.." where aid="..aid
	enSuc, enData = C_updateDb(sql)
	if enSuc == false then
		C_errorLog(space("Database.setColumns1"))
		return false
	end
	
	--blob
	if table.getn(tcol) > 0 then
		enSuc, enData = C_updateColumn(t, tcol, data, "aid=" .. aid)
		if enSuc == false then
			C_errorLog(space("Database.setColumns", t, tcol[1], aid))
			return false
		end
	end
	return true
end





---生成where子句
--@param key 字符串,表明哪个字段
--@param value 值
--@author lqk
function Database.genWhereSub(key, value)
	local t = type(value)
	if t == "number" or t == "string" or t == "boolean" then
		return " and "..key.."=".."'"..value.."'"
	else
		return ""
	end
end







  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值