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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
关系型数据库 MySQL
MySQL常用函数实践总结
MySQL常用函数实践总结
33 0
|
6月前
|
SQL 关系型数据库 MySQL
【Hello mysql】 mysql的内置函数(上)
【Hello mysql】 mysql的内置函数
26 0
|
8天前
|
SQL 关系型数据库 MySQL
初学mysql
本文档介绍了MYSQL中的表格与键的概念,包括列、行、主键和外键。接着,展示了SQL语法基础,如创建、查看、删除数据库及操作表格。讨论了不同数据类型,如decimal、varchar、blob等。通过示例说明如何添加、删除列,插入、更新和删除数据,以及查询技巧,如使用WHERE、ORDER BY和LIMIT子句。
9 0
|
4月前
|
存储 关系型数据库 MySQL
【MySQL学习】MySQL 内置函数1
【MySQL学习】MySQL 内置函数
107 1
【MySQL学习】MySQL 内置函数1
|
4月前
|
存储 关系型数据库 MySQL
【MySQL学习】MySQL 内置函数2
【MySQL学习】MySQL 内置函数
68 2
|
5月前
|
关系型数据库 MySQL
mysql自定义函数
mysql自定义函数
|
8月前
|
SQL 存储 关系型数据库
mysql常见错误汇总
mysql常见错误汇总
94 0
|
10月前
|
关系型数据库 MySQL 数据库
盘点一下Mysql中的一些小知识(五)
盘点一下Mysql中的一些小知识(五)
63 0
|
SQL 存储 Oracle
MySQL总结
一.SQL语句简介 1.什么是SQL? SQL(Structured Query Language):结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”
MySQL总结
|
SQL Oracle 关系型数据库