ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
提供再Lua中反查数据的能力,基于Binlog的数据同步工具,只能监听到单表行数据的变更。无法像基于SQL的ETL工具那样具有多表连接(join)的能力。如果要得到聚合数据,需要使用dbOps模块。 # **示例** t_user表,数据如下: ![](https://img.kancloud.cn/66/6b/666b781251a07831305126e22f76c5a4_713x51.jpg) t_area表,数据如下: ![](https://img.kancloud.cn/eb/c8/ebc8ca2d6a36beb2ffc934cc2d06d542_266x75.jpg) Lua脚本: ``` -- t_user_dbclient.lua local ops = require("redisOps") --加载redis操作模块 local json = require("json") --加载json模块 local db = require("dbOps") --加载数据库操作模块 local row = ops.rawRow() --当前数据库的一行数据,table类型,key为列名称 local action = ops.rawAction() --当前数据库事件,包括:insert、updare、delete local result = {} -- 定义一个table,作为结果 if action == "insert" then -- 只监听插入事件 SADD( local areaId = row["AREA_ID"] --获取区域AREA_ID列的值 -- SQL语句,不能直接使用表名,要使用(数据库名称.表名称),如:ESEAP.T_AREA local sql = string.format("SELECT * FROM ESEAP.T_AREA WHERE ID = '%s'",areaId) -- 执行SQL查询,返回一条查询结果,table类型;结构如:{"ID":"340100000000","NAME":"安徽省 合肥市"} local rs = db.selectOne(sql) local areaName = rs["NAME"] --区域名称 local id = row["ID"] --获取row ID列的值 result["id"] = id result["action"] = action result["userName"] = row["USER_NAME"] --获取row USER_NAME列的值,赋给结果集 result["password"] = row["PASSWORD"] --获取row USER_NAME列的值,赋给结果集 result["createTime"] = row["CREATE_TIME"] --获取row CREATE_TIME列的值,赋给结果集 result["source"] = "binlog" -- 数据来源 result["areaId"] = areaId result["areaName"] = areaName local key = "db_lua_test_"..id -- 定义key local val = json.encode(result) -- 将result转为json ops.SET(key,val) -- 对应Redis的SET命令,第一个参数为key(支持string类型),第二个参数为value end ``` 引入脚本: ``` #目标类型 target: redis # 支持redis、mongodb、elasticsearch、rocketmq、kafka、rabbitmq #规则配置 rule: - schema: eseap #数据库名称 table: t_user #表名称 #order_by_column: id #排序字段,存量数据同步时不能为空 lua_file_path: lua/t_user_dbclient.lua #lua脚本文件 #lua_script: #lua 脚本 ``` 同步到Redis的数据如下: ![](https://img.kancloud.cn/0c/ba/0cbaecdae3dbb80ce09cb8d24559e544_476x305.jpg) # **dbOps模块** 提供的方法如下: 1、selectOne(sql) 查询一条数据,返回table类型的结果;如果查询不到数据,返回空table;如果查询到多个结果,会出错 2、select(sql) 查询多条数据,返回数组类型的结果,数组元素为tablem(格式如:[table1,table2]);查询不到结果,返回空table;