使用LibPQ连接数据库
连接数据库
一个应用程序可以在一个时刻打开多个后端连接(原因之一就是为了访问多个数据库)。每个连接用一个PGconn对象表示,它从函数PQconnectdb、PQconnectdbParams或PQsetdbLogin得到。在通过该连接对象发送查询之前,应该调用PQstatus函数来检查返回值以确定是否得到了一个成功的连接。
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
int
main(int argc, char **argv)
{
const char *conninfo;
PGconn *conn;
conninfo = "user = vbadmin password = 1234Abcde dbname = vastbase";
/* 建立到数据库的一个连接 */
conn = PQconnectdb(conninfo);
/* 检查看后端连接是否成功建立 */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
PQfinish(conn);
}
/* 关闭到数据库的连接并且清理 */
PQfinish(conn);
return 0;
}
非阻塞链接数据库
以非阻塞的方式建立一个到数据库服务器的连接:
PQconnectStartParams、PQconnectStart、PQconnectPoll三个函数被用来开启一个到数据库服务器的连接,这样你的应用的执行线程不会因为远程的I/O而被阻塞。这种方法的要点在于等待 I/O 完成可能在应用的主循环中发生,而不是在PQconnectdbParams或PQconnectdb中,因此应用能够把这种操作和其他动作并行处理。
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
int
main(int argc, char **argv)
{
const char *conninfo, feedback;
PGconn *conn;
int sock;
conninfo = "postgresql://vbadmin:1234Abcde@localhost:5432/vastbase"
/* 建立到数据库的一个连接 */
conn = PQconnectStart(conninfo);
switch(PQstatus(conn))
{
case CONNECTION_STARTED:
feedback = "Connecting...";
break;
case CONNECTION_MADE:
feedback = "Connected to server...";
break;
default:
feedback = "Connecting...";
}
fprintf(stderr, "Connection to database failed: %s\n", feedback);
sock = PQsocket(conn);
if (sock < 0)
{
/* 不应该发生 */
PQfinish(conn);
return 0;
}
/* 关闭到数据库的连接并且清理 */
PQfinish(conn);
return 0;
}
连接字符串
几个libpq函数会解析一个用户指定的字符串来获得连接参数。这些字符串有两种被接受的格式:纯关键词 = 值字符串以及URI。URI通常遵循RFC 3986,除非像下文进一步描述的那样允许多主机连接字符串。
URL格式
一个连接URI的一般形式是:
postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]
URI模式标志符可以是postgresql://
或postgres://
。每一个URI部分都是可选的。如:
postgresql://vbadmin:1234Abcde@localhost:5432/vastbase?host=/tmp&hostaddr=127.0.0.1
参数关键字
主要的参数关键词如下:
- host: 要连接的主机名,如果一个主机名以斜线开始,则表示一个 Unix 域通信而不是 TCP/IP 通信,其值是存储套接字文件的目录名。当host没有指定或者为空时的默认行为是连接到一个/tmp中的 Unix 域套接字。在没有 Unix 域套接字的机器上,默认是连接到localhost。
- hostaddr: 要连接的主机的数字 IP 地址。它应该是标准的 IPv4 地址格式,例如172.28.40.9。如果你的机器支持 IPv6,也可以使用IPv6地址。
- port: 服务端监听的端口,默认为5432.
- dbname: 数据库名。
- user: 连接用户。
- password: 服务器要求口令认证时要使用的口令。
- passfile:
指定用于存放口令的文件名。默认是
~/.pgpass
,或者是Microsoft Windows上的%APPDATA%\postgresql\pgpass.conf
(如果该文件不存在也不会报错)。 - connect_timeout: 连接的最大等待时间,以秒为单位(写作一个十进制整数,例如10)。零、负值或者不指定表示无限等待。允许的最小超时是2秒,因此值1会被解释为2。这个超时单独应用于每个主机名或者IP地址。例如,如果指定两个主机并且connect_timeout为5,每个主机都会在5秒内没有建立起连接的情况下超时,因此花费在等待连接上的总时间可能高达10秒。
- client_encoding: 为连接设置client_encoding配置参数。除了被相应服务器选项所接受的值,你还能使用auto从客户端的当前区域(Unix 系统上的LC_CTYPE环境变量)决定正确的编码。
- options:
指定在连接开始时发送给服务器的命令行选项。例如,设置这个参数为-c geqo=off会把会话的geqo参数值设置为off。这个字符串中的空格被认为是命令行参数的分隔符,除非用一个反斜线
\
对它转义,用\\
可以表示一个字面意义上的反斜线。 - application_name: 为application_name配置参数指定一个值。
关闭到数据库的连接
调用PQfinish关闭与服务器的连接。同时释放PGconn对象使用的内存。
注意,即使与服务器的连接尝试失败(由PQstatus指示),应用也应当调用PQfinish来释放PGconn对象使用的内存。不能在调用PQfinish之后再使用PGconn指针。
PQfinish(conn);
connection.close();