Use luapgsql connect postgresql

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:
lua连接数据库的动态库很多, 这里以luapgsql为例, 讲解如何使用luapgsql连接postgresql.
luapgsql详细用法参考 : 
环境 : 
Lua 5.2
CentOS 5.x x64
PostgreSQL 9.3.2

首先下载luapgsql的源码 : 
git clone https://github.com/mbalmer/luapgsql
cd luapgsql

luapgsql依赖postgresql, libbsd-devel包, 如下 : 

#include <postgres.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>
#include <pg_config.h>
#include <catalog/pg_type.h>
#ifdef __linux__
#include <bsd/bsd.h>
#endif


从README得知, 因为是在Linux下使用luapgsql, 所以会用到GNUmakefile, 修改 GNUmakefile,  LDADD 加入 -L/opt/pgsql9.3.2/lib,  CFLAGS加入 -I/opt/pgsql9.3.2/include/server -I/opt/pgsql9.3.2/include
视你的postgresql环境情况而定.

vi GNUmakefile
SRCS=           luapgsql.c
LIB=            pgsql

LUAVER=         `lua -v 2>&1 | cut -c 5-7`

CFLAGS+=        -O3 -Wall -fPIC -I/usr/include -I/usr/include/lua${LUAVER} \
                -I/opt/pgsql9.3.2/include/server -I/opt/pgsql9.3.2/include -D_GNU_SOURCE
LDADD+=         -L/usr/lib -L/opt/pgsql9.3.2/lib -lpq -lbsd

LIBDIR=         /usr/lib
LUADIR=         /usr/lib/lua/${LUAVER}

${LIB}.so:      ${SRCS:.c=.o}
                cc -shared -o ${LIB}.so ${CFLAGS} ${SRCS:.c=.o} ${LDADD}

clean:
                rm -f *.o *.so
install:
        install -d ${DESTDIR}${LIBDIR}
        install -m 755 ${LIB}.so ${DESTDIR}${LUADIR}/${LIB}.so

安装
make
make install
make install时可能会报错, 因为找不到5.2的lua lib目录. 手工将生成的pgsql.so动态链接库拷贝到你的lua 5.2 lib目录即可
cp pgsql.so /usr/local/lib/lua/5.2/

使用luapgsql
root@db-172-16-3-33-> lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> pgsql = require "pgsql"
> conn = pgsql.connectdb('hostaddr=127.0.0.1 port=5432 dbname=digoal user=digoal password=digoal')
> print(conn:errorMessage())

> print(conn:status())
0
> print ( pgsql.CONNECTION_OK)
0
> res = conn:exec('select info from userinfo limit 10')
> print(res)
userdata: 0x1364ced8
> print(res:ntuples())
10
> print(res:getvalue(1,1))
60bbdab7f524c333a2d7ef38f06444c2


使用print_tbl打印这个模块的内容.
function print_tbl(v_s) 
  if type(v_s) == "table" then
    print(v_s, "contents:-----------------------------------------------")
    for k,v in pairs(v_s) do 
      if type(v_s[k]) == "table" 
      then 
        print(v_s,k,v)
        print_tbl(v_s[k]) 
      else 
        print(v_s,k,v) 
      end 
    end
  else
    error("please enter a table variable.")
  end
end
> con = require "pgsql"
> pgsql = require "pgsql"
> print_tbl(pgsql)
table: 0x1ec8c30        contents:-----------------------------------------------
table: 0x1ec8c30        _COPYRIGHT      Copyright (C) 2009 - 2014 by micro systems marc balmer
table: 0x1ec8c30        PQPING_NO_ATTEMPT       3
table: 0x1ec8c30        PG_DIAG_SOURCE_FILE     70
table: 0x1ec8c30        PGRES_COPY_BOTH 8
table: 0x1ec8c30        SEEK_END        2
table: 0x1ec8c30        connectStart    function: 0x7f4ad61d5610
table: 0x1ec8c30        ping    function: 0x7f4ad61d55c0
table: 0x1ec8c30        CONNECTION_AWAITING_RESPONSE    4
table: 0x1ec8c30        PG_DIAG_SOURCE_FUNCTION 82
table: 0x1ec8c30        PGRES_POLLING_FAILED    0
table: 0x1ec8c30        SEEK_CUR        1
table: 0x1ec8c30        PG_DIAG_INTERNAL_QUERY  113
table: 0x1ec8c30        PGRES_POLLING_WRITING   2
table: 0x1ec8c30        PQPING_REJECT   1
table: 0x1ec8c30        PGRES_SINGLE_TUPLE      9
table: 0x1ec8c30        encryptPassword function: 0x7f4ad61d5540
table: 0x1ec8c30        CONNECTION_STARTED      2
table: 0x1ec8c30        CONNECTION_BAD  1
table: 0x1ec8c30        INV_READ        262144
table: 0x1ec8c30        CONNECTION_AUTH_OK      5
table: 0x1ec8c30        INV_WRITE       131072
table: 0x1ec8c30        PG_DIAG_SEVERITY        83
table: 0x1ec8c30        PQERRORS_TERSE  0
table: 0x1ec8c30        PG_DIAG_CONTEXT 87
table: 0x1ec8c30        PG_DIAG_MESSAGE_PRIMARY 77
table: 0x1ec8c30        PQERRORS_VERBOSE        2
table: 0x1ec8c30        CONNECTION_MADE 3
table: 0x1ec8c30        PQERRORS_DEFAULT        1
table: 0x1ec8c30        PG_DIAG_MESSAGE_HINT    72
table: 0x1ec8c30        PGRES_EMPTY_QUERY       0
table: 0x1ec8c30        _DESCRIPTION    PostgreSQL binding for Lua
table: 0x1ec8c30        PGRES_NONFATAL_ERROR    6
table: 0x1ec8c30        PQPING_OK       0
table: 0x1ec8c30        SEEK_SET        0
table: 0x1ec8c30        PG_DIAG_SOURCE_LINE     76
table: 0x1ec8c30        PG_DIAG_INTERNAL_POSITION       112
table: 0x1ec8c30        PQTRANS_UNKNOWN 4
table: 0x1ec8c30        PG_DIAG_MESSAGE_DETAIL  68
table: 0x1ec8c30        PQTRANS_IDLE    0
table: 0x1ec8c30        _VERSION        pgsql 1.2.3
table: 0x1ec8c30        PG_DIAG_STATEMENT_POSITION      80
table: 0x1ec8c30        PGRES_POLLING_READING   1
table: 0x1ec8c30        PQTRANS_ACTIVE  1
table: 0x1ec8c30        PQTRANS_INTRANS 2
table: 0x1ec8c30        PG_DIAG_SQLSTATE        67
table: 0x1ec8c30        PGRES_BAD_RESPONSE      5
table: 0x1ec8c30        connectdb       function: 0x7f4ad61d5670
table: 0x1ec8c30        PQTRANS_INERROR 3
table: 0x1ec8c30        PQPING_NO_RESPONSE      2
table: 0x1ec8c30        PGRES_POLLING_OK        3
table: 0x1ec8c30        PGRES_COPY_IN   4
table: 0x1ec8c30        CONNECTION_OK   0
table: 0x1ec8c30        PGRES_COMMAND_OK        1
table: 0x1ec8c30        CONNECTION_SETENV       6
table: 0x1ec8c30        libVersion      function: 0x7f4ad61d55f0
table: 0x1ec8c30        CONNECTION_SSL_STARTUP  7
table: 0x1ec8c30        PGRES_COPY_OUT  3
table: 0x1ec8c30        PGRES_TUPLES_OK 2
table: 0x1ec8c30        PGRES_FATAL_ERROR       7

相关实践学习
使用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。
1434 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。
1839 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: ...
4409 0
|
Oracle 关系型数据库 数据库连接
|
关系型数据库 网络安全 数据库