我试图将一个函数的输出赋值给一个变量,但是我做不到。:(
我使用(+luasql-postgres) Lua 5.3.4和luarocks 3.2.1
我的剧本:
luasql = require "luasql.postgres"
value=arg[1]
current_time=os.date("%Y-%m-%d %H:%M:%S")
env = luasql.postgres()
con = assert (env:connect('postgres', 'postgres', 'postgres', '192.168.241.93','5432'))
function printvalues(res)
row = res:fetch ({}, "a")
while row do
print(string.format("%-12s", row.client_addr))
row = res:fetch (row, "a")
end
print()
end
res = assert (con:execute('select client_addr from pg_stat_replication order by replay_lag asc limit 1'))
--txn = res
a = {myfunc = printvalues(res)}
if a == '192.168.242.41' then
print("backend1")
elseif a == '192.168.241.76' then
print("backend2")
end
print(string.format("%-12s",a))
print(a)脚本结果:
root@haproxy:/etc/haproxy# lua scripts/test.lua
192.168.1.76
table: 0x559fadf97080
table: 0x559fadf97080请告诉我:
如何将函数的结果分配给variable?
输出中的空行
发布于 2019-10-25 15:40:53
您需要在函数体中创建一个printvalues语句以返回值
print()语句我看到您正在使用limit 1进行查询,因为您将只获得一个值,所以while循环语句是无用的。
我希望这对你有用
local luasql = require "luasql.postgres"
local env = luasql.postgres()
local con = assert (env:connect(
'postgres', 'postgres', 'postgres', '192.168.241.93', '5432'
))
local res = assert(con:execute(
'select client_addr from pg_stat_replication order by replay_lag asc limit 1'
))
local row = res:fetch({}, 'a')
local a = string.format('%-12s', row.client_addr)
res:close()
if a == '192.168.242.41' then
print('backend1')
elseif a == '192.168.241.76' then
print('backend2')
end
print(a)但是,如果您想要一个带有函数的示例:
local luasql = require "luasql.postgres"
local env = luasql.postgres()
local con = assert (env:connect(
'postgres', 'postgres', 'postgres', '192.168.241.93', '5432'
))
local res = assert(con:execute(
'select client_addr from pg_stat_replication order by replay_lag asc limit 1'
))
local function printvalues(res)
local row = res:fetch({}, 'a')
res:close()
return string.format('%-12s', row.client_addr)
end
local a = printvalues(res)
if a == '192.168.242.41' then
print('backend1')
elseif a == '192.168.241.76' then
print('backend2')
end
print(a)尝试在变量之前使用local关键字,这将使它们成为作用域变量。
发布于 2019-10-28 07:38:10
谢谢。最后我使用了这个脚本:
luasql = require "luasql.postgres"
env = luasql.postgres()
con = assert (env:connect('postgres', 'postgres', 'postgres','333.333.333.333','5432')) --master
backend = function(txn)
res = assert (con:execute('select client_addr from pg_stat_replication order by replay_lag asc limit 1'))
row = res:fetch ({}, "a")
while row do
ip = string.format("%-12s", row.client_addr)
row = res:fetch (row, "a")
end
result = "backend1"
if ip == '111.111.111.111' then
result = "backend1"
elseif ip == '222.222.222.222' then
result = "backend2"
end
return result
end
core.register_fetches("choose_backend", backend)https://stackoverflow.com/questions/58554715
复制相似问题