项目中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