orm数据库关系映射

orm数据库关系映射
api

修改记录

2024/8/16

增加API
get_entry_by_limit分页查询
get_entry_by_inIN 查询

2024/8/17

delete_entry_by_range 范围删除

2024/11/13

热更支持

之前热更存在这个问题。

热更orm_table 注意点

如果一个服务访问了orm_table_m服务,这个服务同时跟orm_table_m一起热更,由于 使用orm的限制的特性,旧的orm服务不在提供服务,然后旧的访问orm的服务又不能切换访问到新的orm服务。这时旧的服务将访问不了orm服务。

然后就暂时禁用的orm的热更支持。

orm_table_m不支持热更

由于热更orm_table 注意点的问题,会导致旧服务访问不了orm_table_m服务,这很可能不符合业务预期,所以就禁止了orm_table_m热更,对于orm的修改,都需要重启更新。

仔细想了一段时间,orm热更还是得支持,不然怎么做到大部分情况下不停服更新。为了让orm能热更就得解决热更orm_table 注意点这个冲突特性的问题。
办法就是旧的服务能切换访问新的orm服务,至于旧服务访问新访问存在的问题,就只能使用者,自己去把握好,如果想热更的好,尽量不要改动到handle的参数和返回值,不然旧服务访问新的orm就可能出错。

出错情况演示:

orm 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
local M = {}

function M.init()
local adapter = ormadapter_mysql:new("admin")
g_orm_obj = ormtable:new("t_player")
:int64("player_id")
:int64("nickname")
:int8("sex")
:int8("status")
:set_keys("player_id")
:builder(adapter)

return g_orm_obj
end

local handle = {}

function handle.get_player(player_id)
local entry = g_orm_obj:get_one_entry(player_id)
return entry:get_entry_data()
end

M.handle = handle

return M

test_m 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
local CMD = {}

function CMD.start()
skynet.fork(function()
orm_table_client:instance("player"):get_player(100001)
end)
return true
end

function CMD.exit()
return true
end

return CMD

修改后

orm 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
local M = {}

function M.init()
local adapter = ormadapter_mysql:new("admin")
g_orm_obj = ormtable:new("t_player")
:int64("player_id")
:int64("nickname")
:int8("sex")
:int8("status")
:set_keys("player_id")
:builder(adapter)

return g_orm_obj
end

local handle = {}

function handle.get_player(player_id, player_id_2)
local entry = g_orm_obj:get_one_entry(player_id)
local entry_2 = g_orm_obj:get_one_entry(player_id, player_id_2)
return entry:get_entry_data(), entry_2:get_entry_data()
end

M.handle = handle

return M

test_m 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
local CMD = {}

function CMD.start()
skynet.fork(function()
orm_table_client:instance("player"):get_player(100001, 100002)
end)
return true
end

function CMD.exit()
return true
end

return CMD

热更

此时如果旧的test_m服务调用了新的orm player服务的get_player, get_player指定报错。我觉得需要热更的情况下,更改orm的handle方法的话,就直接新增一个方法吧。

建议

热更情况下,不要修改orm 原来的handle函数,只新增,这样确保不会有问题。


orm数据库关系映射
https://huahua132.github.io/2023/02/25/skynet_fly_word/word_3/H_orm/
作者
huahua132
发布于
2023年2月25日
许可协议