任意语言访问PostgreSQL:C语言接口

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

作为一名系统管理员,可能每天都要通过某段程序连接到数据库。开源软件的一个好处是可以根据需要修改程序代码。如果程序后台使用PostgreSQL数据库,可以很容易用各种语言对其进行访问。本文作为系列文章的第一篇,会陆续介绍C、C++、PHP、Tcl、Python及Perl等编程语言对PostgreSQL的访问方法。

  需要说明的是,本文不太适合完全没有编程经验的读者。不过只要读者有基本的SQL知识,以及懂得至少一种编程语言即可看懂。也许读者正在使用的系统是Linux,但是只要使用的客户端API接口在其他系统可用,则程序代码不需更改即可在其他操作系统上正常使用。本文所示的代码全部基于Postgre 9.1,是目前最新的稳定版本,已经安装并经过测试。在本文的操作环境中,客户端与服务端位于不同的计算机,但位于同一局域网内,这种情况下可以在客户端通过命令gpsql -U postgre -h x.x.x.x很容易地连接到服务端。

  首先要确保在客户端机器上有安装软件的权限,并且最好确保当前使用的数据库只做当前测试用,以免任何因不小心的操作导致重要数据的损坏。

  C语言接口

  在与数据库连接方面,C语言是一种常用语言,许多数据库都是用C写的。该语言高效灵活,因此如果想要写一款客户端接口,不管是仅仅包含控制台还是基于GUI的,并且不想用到浏览器,C语言也许是最好的选择。

  连接C语言与Postgres使用的库名为libpq,它与PostgreSQL源码树绑定在一起。如果安装数据库系统时使用的是二进制文件而不是从源码编译安装,libpq可被单独安装,但也要记得需要使用选项-dev package(或-devel,取决于Linux系统的版本)。在Debian及其分发版上,安装libpq的命令为 #aptitude install libpq-dev。在基于RedHat的系统上,如CentOS,可以在postgresqlxx-libs包中找到libpq,其中xx为主要和次要版本号。因此要连接到PostgreSQL 9.1数据库,如果使用Fedora16,则需要安装postgresql91-lib或postgresql-devel。由于RHEL/CentOS用户大多使用Postgres库,导致程序的名称可能会有一些不同,而且由于Fedora用户能够使用更多最新的包,因此仅仅在使用一个旧版本时才需要第三方库。简而言之,任何支持PostgreSQL的系统均有其可用的libpq。

  除了C语言,libpq同时也是C++、Perl和Tcl的API引擎,提供基本的函数对数据库进行连接、查询和修改。许多常用的函数都包含“PQ”前缀,如PQconnectdb或PQerrormessage。更多示例可查看PostgreSQL文档或查看src/test/examples。在C程序文件中,包含libpq-fe.h头文件并在编译时添加相应的链接标记-lpq。

  安装并设置好之后,要做的第一件事就是连接数据库。PQconnectdb()函数带一个char *conninfo格式的参数,参数格式如dbname=[database_name],当然也可以是其他内容,只要格式对即可,最常用的关键字为host,hostaddr(numeric格式,以避免无用的DNS查询),port,user,password与sslmode。如果不使用参数,则会使用默认选项。假设服务器地址为192.168.0.101,username为postgres,数据库名为testdb1,尝试连接数据库的代码如下所示:

#include <stdio.h>
#include <libpq-fe.h>
int main(int argc,char argv[])
{
    const char *conninfo;
    PGconn *conn;
    if (argc > 1)
        conninfo = argc[1];
    else
    {
        printf("Not enough arguments, exiting...");
        return 1;
    }
    conn = PQconnectdb(conninfo);
    /*Check to see how I did */
    if(PQstatus(conn) = CONNECTION_OK)
        printf("Connection succeeded.\n");
    else
    {
        /*Do something to deal with the error*/
    }
}
将代码保存为testlibpq并编译,编译后的程序用法如下:

$ testlibpg "hostaddr=192.168.0.101 user=postgres dbname=testdb1"
如果不出错误,会在屏幕上看到提示“Connection succeeded.”,表示连接数据库成功,不过上文并没有什么实际用处。那么何为实际用处呢----对数据进行查询,但这里先介绍如何断开连接,即调用PQfinish,该函数只有一个参数PGconn *conn,并返回void。

  PQexec函数执行查询,参数为PGconn *conn与const char *command,返回一个PGresult类型的对象。在如下示例中,声明一个PGresult变量,并向服务器发送一个命令。读者可自行编写检查连接与否以及错误处理的代码。

  PGresult *res;

  res = PQexec(conn, "SELECT * FROM mydatabase");

  PQclear(res);
显然这段代码无法编译,只是为了向读者展示libpq库提供的功能,而不是直接提供可用代码。不过在这段代码中,res包含了查询结果,读者可以任意对其进行解析。PQresultStatus可以查询命令的状态,该函数返回PGRES_COMMAND_OK或 PGRES_FATAL_ERROR.。可在PostgreSQL项目页面找到exec函数的一个综合列表。

  下面介绍一些有用的函数,例如,PQntuples函数将给定的res作为参数,以整数类型返回表中列的数量。如果查询的状态为PGRES_TUPLES_OK,则它以PGresult对象为参数,并返回一个整型值。PQnfields函数给出每行的列数。PQfname函数返回与某数字关联的列的名字,PQfnumber函数功能则完全相反。要得到某一单元的值,需要将PGresult以及单元的列号和行号传给PQgetvalue函数。

  可以看到这些函数都比较简单,但PQexec不能同时处理多个SQL命令,因为该函数只能返回一个结构,如果有多个命令,则只能返回最后一个命令的结果。另一个不足是,PQexec在执行一个命令时会一直等到命令返回,因此读者在使用该命令遇到阻塞执行时要分外小心。如果这些不足影响到读者用户的使用,可以使用其它函数代替,如PQsendQuery和PQgetResult等,可使用这些函数来进行异步查询处理。
 








本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/792475,如需转载请自行联系原作者
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
284 82
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】在PostgreSQL中访问Oracle
本文介绍了如何在PostgreSQL中使用oracle_fdw扩展访问Oracle数据库数据。首先需从Oracle官网下载三个Instance Client安装包并解压,设置Oracle环境变量。接着从GitHub下载oracle_fdw扩展,配置pg_config环境变量后编译安装。之后启动PostgreSQL服务器,在数据库中创建oracle_fdw扩展及外部数据库服务,建立用户映射。最后通过创建外部表实现对Oracle数据的访问。文末附有具体操作步骤与示例代码。
103 6
【赵渝强老师】在PostgreSQL中访问Oracle
|
2月前
|
关系型数据库 数据库 PostgreSQL
【赵渝强老师】在PostgreSQL中使用file_fdw访问外部文件系统
本文介绍了PostgreSQL的file_fdw扩展,它支持直接从数据库访问服务器文件系统中的文件,文件格式需为text、csv或binary。内容涵盖从编译安装扩展、配置postgresql.conf参数、重启数据库实例,到创建扩展、外部文件服务及外部表的完整流程,并通过具体示例展示如何查询外部表数据,同时附有视频讲解以帮助理解操作步骤。
100 22
|
2月前
|
关系型数据库 数据库 PostgreSQL
【赵渝强老师】使用postgre_fdw访问外部PostgreSQL
本文介绍了如何使用postgres_fdw扩展让PostgreSQL访问外部远端数据库数据。通过编译安装扩展、修改配置文件、重启数据库、创建扩展及外部服务器对象等步骤,最终实现本地数据库通过外部表访问远程数据。附带视频讲解,详细演示操作流程,并提醒需调整远端PostgreSQL配置以支持远程登录。
|
5月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
142 20
|
5月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
87 0
|
7月前
|
Unix 编译器 C语言
[oeasy]python052_[系统开发语言为什么默认是c语言
本文介绍了C语言为何成为系统开发的首选语言,从其诞生背景、发展历史及特点进行阐述。C语言源于贝尔实验室,与Unix操作系统相互促进,因其简洁、高效、跨平台等特性,逐渐成为主流。文章还提及了C语言的学习资料及其对编程文化的影响。
64 5
|
8月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
187 6
|
8月前
|
存储 缓存 算法
C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力
本文探讨了C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力。文章还分析了数据结构的选择与优化、算法设计的优化策略、内存管理和代码优化技巧,并通过实际案例展示了C语言在排序和图遍历算法中的高效实现。
210 2
|
9月前
|
存储 程序员 编译器
初识C语言,计算机语言的基石
初识C语言,计算机语言的基石

热门文章

最新文章

推荐镜像

更多