Lua 5.1 Use luadbi connect to postgresql

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
使用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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6月前
|
关系型数据库 开发工具 C语言
PostgreSQL libpq开发入门
简单入门C语言开发基于PostgreSQL libpq应用
104 0
|
9月前
|
前端开发 关系型数据库 测试技术
PostgreSQL 14通过libpq改进logging
PostgreSQL 14通过libpq改进logging
45 0
|
SQL 关系型数据库 数据库
|
关系型数据库 MySQL 数据库
PostgreSQL外部数据插件:mysql_fdw
概述 PostgreSQL具有插件功能,通过不同的插件拓展,实现数据库本身不包含的功能,以满足用户的需求。mysql_fdw 就是一个强大的外部表功能,所谓外部表,就是在PG数据库中通过SQL访问外部数据源数据,就像访问本地数据库一样,下面就来测试一下使用mysql_fdw 来访问mysql中的数...
10285 2
|
关系型数据库 PostgreSQL
|
Java 关系型数据库 数据库连接
|
SQL 关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL