Lua 5.1 Use luadbi connect to postgresql

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
使用Lua 连接postgresql的驱动很多, 前面我介绍了一下luasql, luapgsql的使用, 其中luasql由于不支持prepared sql, 所以在大量SQL请求的情况下, 效率会比较低. luapgsql则支持prepared sql, 效率接近pgbench, 还是不错的.
本文将介绍一下luadbi这个驱动, 它同样支持多个数据库种类, 其中postgresql这个也是使用libpq来支持的. 
luadbi这个 0.5版本 驱动在5.1下面可以正常使用, 但是Lua 5.2下面会报错.
首先要安装Lua 5.1, 详见INSTALL文件描述.
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
tar -zxvf lua-5.1.5.tar.gz
cd lua-5.1.5
make linux
make install INSTALL_TOP=/opt/lua5.1

然后要安装luadbi, 详细说明参考INSTALL文件.
mkdir luadbi
cd luadbi
wget https://luadbi.googlecode.com/files/luadbi.0.5.tar.gz
tar -zxvf luadbi.0.5.tar.gz
修改Makefile, 包含正确的lua include目录, postgresql include目录, postgresql lib目录.
vi Makefile
CFLAGS=-g -pedantic -Wall -O2 -shared -fpic -I /opt/lua5.1/include -I /usr/include/mysql -I /opt/pgsql9.3.2/include -I /opt/pgsql9.3.2/include/server -I /opt/ibm/db2exc/V9.5/include/ -I /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/rdbms/public/ -I .
PSQL_LDFLAGS=$(COMMON_LDFLAGS) -L/opt/pgsql9.3.2/lib -lpq 
生成so文件. 会生成dbdpostgresql.so文件.
make psql
把so文件和DBI.lua拷贝到lua 5.1的lib目录.
cp dbdpostgresql.so DBI.lua /usr/local/lib/lua/5.1/


测试
[root@db-172-16-3-33 luadbi]# /opt/lua5.1/bin/lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> require "DBI"
> dbh = assert(DBI.Connect('PostgreSQL', 'digoal', 'digoal', 'digoal', '127.0.0.1', '5432'))
> dbh:autocommit(true)
> res = DBI.Do(dbh, "create table test(id int, info text, crt_time timestamp)")
> insert = assert(dbh:prepare('insert into test(id,info,crt_time) values(?,?,?)'))
> insert:execute(1, 'test', 'now()')

digoal=> select * from test;
 id | info |          crt_time          
----+------+----------------------------
  1 | test | 2014-02-22 13:04:42.488098
(1 row)


在Lua 5.2中使用会报错.
> DBI = require "DBI"
> DBI.Connect('PostgreSQL', dbname, dbuser, dbpassword, dbhost, dbport)
/usr/local/lib/lua/5.2/DBI.lua:52: Cannot load driver PostgreSQL. Available drivers are: (None)
stack traceback:
        [C]: in function 'error'
        /usr/local/lib/lua/5.2/DBI.lua:52: in function 'Connect'
        stdin:1: in main chunk
        [C]: in ?
来自DBI.lua
-- Driver to module mapping
name_to_module = {
    MySQL = 'dbd.mysql',
    PostgreSQL = 'dbd.postgresql',
    SQLite3 = 'dbd.sqlite3',
    DB2 = 'dbd.db2',
    Oracle = 'dbd.oracle',
}

string = require('string')

-- Returns a list of available drivers
-- based on run time loading
function available_drivers()
    local available = {}

    for driver, modulefile in pairs(name_to_module) do
        local m, err = pcall(require, modulefile)

        if m then
            table.insert(available, driver)
        end
    end

    -- no drivers available
    if table.maxn(available) < 1 then
        available = {'(None)'}
    end

    return available
end

 -- High level DB connection function
 -- This should be used rather than DBD.{Driver}.New
function _M.Connect(driver, ...)
    local modulefile = name_to_module[driver]

    if not modulefile then
        local available = table.concat(available_drivers(), ',')
        error(string.format("Driver '%s' not found. Available drivers are: %s", driver, available))
    end

如果要支持Lua 5.2, 需要对DBI.lua作出修改才行 .

[参考]
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列7 - topn 加速(count(*) group by order by count(*) desc limit x) (use 估值插件 topn)
标签 PostgreSQL , topn , topn.number_of_counters , count(*) group by order by count(*) desc limit x 背景 count(*) group by order by count(*) desc limit x 用来统计 topn。
1430 0
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列6 - count(distinct xx) 加速 (use 估值插件 hll|hyperloglog)
标签 PostgreSQL , hll , hyperloglog , distinct , 加速 , citus.count_distinct_error_rate 背景 在分布式数据库中,计算count(distinct xxx),需要对distinct 的字段, 1、去重, 2、重分布去重后的数据,(这一步,如果distinct值特别多,那么就会比较耗时) 3、然后再去重, 4、最后count (xxx), 5、求所有节点的count SUM。
1834 0
|
弹性计算 关系型数据库 测试技术
PostgreSQL 11 tpcc 测试(103万tpmC on ECS) - use sysbench-tpcc by Percona-Lab
标签 PostgreSQL , tpcc 背景 环境 阿里云虚拟机 [root@pg11-test ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: ...
4385 0
|
索引 存储
lua 初接触 --- The first time use Lua for programing
  The first time use Lua for programing  Wang Xiao      1. 关于 lua 的变量类型:     lua 变量的定义与matlab有点不同:         local d , f = 5 ,10 --声明局部变量 d,f。
|
Oracle 关系型数据库 数据库连接
下一篇
无影云桌面