正在写一个ORM,其中一个功能是定义模型的时候根据传递的表名从数据库中获取表的字段信息。但如果在require模型的时候去查询会有attempt to yield across c-call boundary的问题.
比如定义一个模型:
-- model/user.lua
local User = ORM.define_model('resty_user') --要连数据库获取字段,db:connect()
return User
-- app.lua
local User = require'model.user' -- 这里就报错了
想请教各位,如何设计程序,能够使其延后连接数据库?
比如这样:
-- orm.lua
function define_model(table_name)
local function _init_model(Model)
say('inited '..table_name) -- parse table schema db:connect()
function Model.find_one(id)
return id
end
setmetatable(Model, {})
return Model
end
local inited = false
return setmetatable({}, {
__index = function(self, key)
if not inited then
_init_model(self)
inited = true
end
return rawget(self, key)
end
})
end
return define_model
-- model/user.lua
local User = define_model('resty_user')
function User:get(id)
return id
end
return User
这样通过__index可以有一个初始化的过程,但感觉太过取巧,不是很喜欢。请大神们指点一下 ^ ^