【问题标题】:How to add function output to a variable using luasql如何使用 luasql 将函数输出添加到变量
【发布时间】:2019-10-25 08:16:32
【问题描述】:

我正在尝试将函数的输出分配给变量,但我做不到。 :(

我使用 Lua 5.3.4luarocks 3.2.1 (+luasql-postgres)

我的脚本:

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

请告诉我:

  1. 如何将函数的结果分配给变量?

  2. 如何去除函数输出中的空行printvalues(res)

【问题讨论】:

    标签: lua luasql


    【解决方案1】:
    1. 需要在函数体中创建return 语句才能返回值
    2. 示例中的空行是函数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关键字,这将使它们成为范围变量

    【讨论】:

      【解决方案2】:

      谢谢。我最终使用了这个脚本:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 2022-11-23
        相关资源
        最近更新 更多