OushuDB-编程接口 - libpq-数据查询和数据操纵

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: OushuDB-编程接口 - libpq-数据查询和数据操纵

在获取到PGconn实例后,我们就可利用PGconn实例进行对数据库的操作了,Libpq执行sql命令的核心 函数为PQexec(PGconn conn, const char command);其中第一个参数为连接。第二个为执行的命 令,其中command字符串可以包含多条执行命令,如果不加入begin或者commit的关键字,command 字符串中的所有命令将在一个事务中执行,并且只要其中一条失败,就会导致整个command执行失 败。

PGresult PQexec(PGconn conn, const char *query); PQexec函数的返回类型为PGresult,如果返回值为null,说明执行失败,也可以通过

PQerrorMessage()方法查看错误消息。

在libpg中,查询语句和更新语句都是通过PQexec函数执行,但是很明显对于这两种语句我们需要的返 回值肯定不同,所以在解析PGresult时,libpq提供了不同的解析函数,这部分先说说解析查询结果用到 的几个函数

PQnfields(PGresult res):用于获取结果集中列的数目 PQfname(PGresult res,int i):用于获取结果集中列的名称 PQntuples(PGresult res):用于获取结果集中行的数目 PQgetvalue(PGresult res,int i,int j):用于获取结果集中i行j列的值

比如下面这一段:

res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");//为 查询语句声明一个游标

if (PQresultStatus(res) != PGRES_COMMAND_OK)//判断游标生成是否成功

{

fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);

} //这里需要注意不再使用的PGresult需要及时释放,否则可能会造成内存泄漏 PQclear(res);

res = PQexec(conn, "FETCH ALL in myportal");//FETCH ALL表示从结果中取回全部数据 if (PQresultStatus(res) != PGRES_TUPLES_OK)

{

fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);

}

// 首先,打印出列名

nFields = PQnfields(res); for (i = 0; i < nFields; i++)

printf("%-15s", PQfname(res, i));

printf("\n\n");

// 接下来,打印出行

for (i = 0; i < PQntuples(res); i++)

对于select语句,我们在解析PGresult时需要的是结果集,所以在上面调用了以上几个函数,但是在插 入、删除和修改语句时我们更关心的受影响的行数,这时我们可以通过PQntuples(const PGresult *res) 来获取受影响函数,其中对于PGresult而言它的成员中包含了所有执行的结果,不同的解析函数只是用 来取得PGresult中相应的成员而已,更多的关于PGresult的实现,大家可以参考官方文档。

res = PQexec(conn, "delete from department where d_id=101;");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "delete failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);

} printf("updatelin:%s",PQcmdTuples(res));//解析并打印受影响行数 PQclear(res);

执行 命令,可以完成libpq程序.c文件的编译,生成可执行文件

终止连接

在我们完成操作后,可以选择通过PQfinish()函数终止连接以释放资源:

gcc -L $libpath -I $includepath -lpq -o testlipq testlipq.c

目录
相关文章
|
SQL 关系型数据库 MySQL
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章(下)
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章
|
SQL 关系型数据库 MySQL
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章(上)
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章
|
2月前
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率
|
5月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
49 1
|
7月前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
55 0
|
SQL 数据库 数据库管理
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(三)
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(三)
|
SQL 关系型数据库 MySQL
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(二)
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL( 3.4 数据查询 )(二)
|
SQL 关系型数据库 MySQL
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL(3.5-3.7)(一)
数据库系统概论 ---- 第三章 -- 关系数据库标准语言SQL(3.5-3.7)
|
SQL 关系型数据库 MySQL
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章(中)
MySQL知识【DML:数据操作语言&DQL:数据查询语言】第六章
|
SQL 存储 数据库
第3章 关系数据库标准语言SQL——3.3 数据定义
第3章 关系数据库标准语言SQL——3.3 数据定义