热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

libpq-PostgreSQL客户端编程接口使用基础教程

PostgreSQL作为目前最优秀的跨平台的开源数据库,其介绍及优点这里不再赘述,它能让我以最快的速度忘记my*,ms*。libpq是PostgreSQL的C应用程序接口,它允许客户程序向PostgreSQL服务器进程发送查询并获得查询结果。我的实验环境是:操作系统:Linuxwheez

PostgreSQL作为目前最优秀的跨平台的开源数据库,其介绍及优点这里不再赘述,它能让我以最快的速度忘记my*,ms*。libpq是PostgreSQL的C应用程序接口,它允许客户程序向PostgreSQL服务器进程发送查询并获得查询结果。

我的实验环境是:
操作系统:Linux wheezy 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2 x86_64 GNU/Linux
数据库:EnterpriseDB (PostgreSQL Plus Advanced Server)9.2.1.3
示例语言:c++
工具:cmake2.8.9,g++ (Debian 4.7.2-5) 4.7.2

可能大家只知道PostgreSQL,对EnterpriseDB则比较陌生,这里简单介绍一下EnterpriseDB。EnterpriseDB是在PostgreSQL基础上,针对企业级应用进行了专门的优化,同时增加了一系列如动态性能调优(DynaTune)、EDB Loader、高效批量SQL处理等高级特性;另外EnterpriseDB与Oracle近乎完美的兼容性以及相对Oracle低廉的价格更是一大亮点,这些优异的特点加上IBM与Redhat的巨额注资,我看好它。EnterpriseDB的libpq与PostgreSQL开源版本完全一致,所以这里您也可以使用PostgreSQL。

一、准备项目文件CMakeLists.txt,设置libpq的依赖项
使用 libpq 的前端程序必须包括头文件 libpq-fe.h 并且必须与 libpq 库链接。我们创建一个简单的示例项目,并且用cmake作为项目管理工具,这样可以同时复习之前介绍过的cmake相关的知识。

创建CMakeLists.txt文件,里面的内容如下:

project(edbconn)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
SET(PG_BASE "/opt/PostgresPlus/9.2AS")
INCLUDE_DIRECTORIES("${PG_BASE}/include")
LINK_DIRECTORIES("${PG_BASE}/lib")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} "${PG_BASE}/lib/libpq.so")

简单解释一下:
INCLUDE_DIRECTORIES("${PG_BASE}/include")
告诉编译器在哪里去找PostgreSQL的头文件,我的EnterpriseDB安装目录是在/opt/PostgresPlus/9.2AS,INCLUDE_DIRECTORIES("/opt/PostgresPlus/9.2AS/include")这样写也是一样的。
LINK_DIRECTORIES("/opt/PostgresPlus/9.2AS/lib")
告诉编译器外部依赖库,也就是libpq的位置
最后不要忘了告诉编译器依赖项
TARGET_LINK_LIBRARIES(${PROJECT_NAME} "/opt/PostgresPlus/9.2AS/lib/libpq.so")

二、用c++通过libpq连接PostgreSQL数据库
类似学习一门新的编程语言从hello world!开始,现在先从连接数据库开始。这次demo是用c++作为开发语言,我陆续会写写 C#与PostgreSQL相关的笔记。

别忘记包含libpq-fe.h头文件 。
使用libpq连接PostgreSQL,首先要创建一个PGconn对象。
PGconn *conn;
1、PQconnectdb
定义:PGconn *PQconnectdb(const char *conninfo);
函数PQconnectdb的参数conninfo定义为:

char *conninfo = "hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb";

conninfo字符串指定数据库的连接信息,各参数之间用空格隔开。参数hostaddr指定数据库主机的IP地址,port指定EnterpriseDB的端口,dbname指定连接的数据库,user和password...。
cOnn= PQconnectdb(conninfo);
2、PQsetlogin
定义:PGconn *PQsetdbLogin(const char *pghost,
const char *pgport,
const char *pgoptions,
const char *pgtty,
const char *dbName,
const char *login,
const char *pwd);
如果没有给固定参数指定默认值,写NULL或一个空字符串就可以了。

conn = PQsetdbLogin("localhost","",NULL,NULL,"mydb","enterprisedb","edb");

PQconnectdb和PQsetdbLogin函数区别不大,怎么用方便就怎么用。

三、连接状态函数
1、返回连接建立时的参数,这些值是固定的
返回连接的数据库名
char *PQdb(const PGconn *conn);
返回连接的用户名
char *PQuser(const PGconn *conn);
返回连接的密码
char *PQpass(const PGconn *conn);
返回连接的服务器主机名
char *PQhost(const PGconn *conn);


返回连接的端口
char *PQport(const PGconn *conn);
2、返回对PGconn对象操作时的状态数据
返回连接的状态。
ConnStatusType PQstatus(const PGconn *conn);
ConnStatusType的值最常用的两个是CONNECTION_OK或 CONNECTION_BAD。

// 判断与PostgreSQL的连接是否成功
if (PQstatus(conn) != CONNECTION_OK)
{
     // do nothing...
}

查询服务器当前的参数设置
const char *PQparameterStatus(const PGconn *conn, const char *paramName);
参数paramName可使用的值有:server_version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes 和 standard_conforming_strings

 // PQparameterStatus
 //
 cout << "server_version : " << PQparameterStatus(conn,"server_version") << endl;
 cout << "server_encoding : " << PQparameterStatus(conn,"server_encoding") << endl;
 cout << "client_encoding : " << PQparameterStatus(conn,"client_encoding") << endl;
 cout << "session_authorization : " << PQparameterStatus(conn,"session_authorization") << endl;
 cout << "DateStyle : " << PQparameterStatus(conn,"DateStyle") << endl;
 cout << "TimeZone : " << PQparameterStatus(conn,"TimeZone") << endl;
 cout << "integer_datetimes : " << PQparameterStatus(conn,"integer_datetimes") << endl;
 cout << "standard_conforming_strings : " << PQparameterStatus(conn,"standard_conforming_strings") << endl;

返回连接中操作产生的最近的错误信息。
char *PQerrorMessage(const PGconn *conn);

返回当前连接的进程ID(PID)
int PQbackendPID(const PGconn *conn);

到这里,已经可以通过libpq连接到PostgreSQL数据库了。

示例代码:

 #include 
 #include "libpq-fe.h"
 using namespace std;
 static void exit_nicely(PGconn *conn)
 {
     PQfinish(conn);
 }
 int main()
 {
         PGconn       *conn;
         /*
          * PGconn *PQconnectdb(const char *conninfo);
         */
         //const char *conninfo = "hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb";
         // conn = PQconnectdb(conninfo);
         conn = PQconnectdb("hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb");
         /*
          *PGconn *PQsetdbLogin(const char *pghost,
              const char *pgport,
              const char *pgoptions,
              const char *pgtty,
              const char *dbName,
              const char *login,
              const char *pwd);
         */
         /* Make a connection to the database */
         //conn = PQsetdbLogin("localhost","5444",NULL,NULL,"mydb","enterprisedb","edb");
         /* Check to see that the backend connection was successfully made */
         if (PQstatus(conn) != CONNECTION_OK)
         {
             cout << "connect failed. PQstatus : " << PQstatus(conn)  << endl;
             // char *PQerrorMessage(const PGconn *conn);
             cout << PQerrorMessage(conn) << endl;
             exit_nicely(conn);
             return ;
         }
         // PQdb
         cout << "数据库名 : " << PQdb(conn) << endl;
         // PQuser
         cout << "用户名 : " << PQuser(conn) << endl;
         // PQpass
         cout << "口令 : " << PQpass(conn) << endl;
         switch(PQstatus(conn))
         {
         case CONNECTION_STARTED:
             cout << "正在连接..." << endl;
             break;
         case CONNECTION_MADE:
             cout << "与服务器连接已建立..." << endl;
             break;
         case CONNECTION_AUTH_OK:
             cout << "auth is ok." << endl;
             break;
         case CONNECTION_OK:
             cout << "connected." << endl;
             break;
         default:
             cout << "正在连接..." << endl;
         }
         cout << "---------- 连接状态函数 ---------- " << endl;
         //
         // PQparameterStatus
         // server_version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes 和 standard_conforming_strings
         cout << "server_version : " << PQparameterStatus(conn,"server_version") << endl;
         cout << "server_encoding : " << PQparameterStatus(conn,"server_encoding") << endl;
         cout << "client_encoding : " << PQparameterStatus(conn,"client_encoding") << endl;
         cout << "session_authorization : " << PQparameterStatus(conn,"session_authorization") << endl;
         cout << "DateStyle : " << PQparameterStatus(conn,"DateStyle") << endl;
         cout << "TimeZone : " << PQparameterStatus(conn,"TimeZone") << endl;
         cout << "integer_datetimes : " << PQparameterStatus(conn,"integer_datetimes") << endl;
         cout << "standard_conforming_strings : " << PQparameterStatus(conn,"standard_conforming_strings") << endl;
         // PQprotocolVersion
         cout << "PQprotocolVersion : " << PQprotocolVersion(conn) << endl;
         // PQbackendPID
         cout << "PQbackendPID : " << PQbackendPID(conn) << endl;
         // PQgetssl
         cout << "PQgetssl : " << PQgetssl(conn) << endl;
         PQfinish(conn);
         return ;
 }

推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 阿里云服务器iis设置方法与上千种Linux桌面版本相比,Linux服务器只有可怜的十几种。但想要选对适合你的企业需要的仍然不是件容易的事情,选Linux服务器首先要 ... [详细]
  • 如何查看电脑系统版本_腾讯云服务器系统版本怎么看?Windows和Centos版本怎么选?...
    腾讯云服务器系统版本怎么看?想要知道自己的腾讯云服务器系统版本是哪个,可以登录云服务器后台管理系统查看,或者使用命令行查询,如果不会操作& ... [详细]
  • 如何监控 Linux 服务器状态?,分享
    Linux服务器我们天天打交道,特别是Linux工程师更是如此。为了保证服务器的安全与性能,我们经常需要监控服务器的一些状态,以保证工作能顺利开展。本文介绍的几个命令,不仅仅适用于 ... [详细]
  • 主流操作系统简介
    主流操作系统简介子墨居士操作系统理论定义为管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键组成部分࿰ ... [详细]
  • 新新于2005-09-1415:02:23发表:利用chbg程序动态制作屏保XScreenSaver是一个开放的框架,就像一个服务器,任何一个可以在根窗 ... [详细]
  • Ubuntu简介Ubuntu(乌班图)是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在” ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
author-avatar
圈圈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有