上一篇
场景引入:
凌晨3点,你的程序突然崩溃,日志里堆满了SQL查询超时
的报错,作为团队里唯一懂C/C++的"数据库救火队员",你盯着屏幕喃喃自语:"要是能直接让C++和PostgreSQL对话,而不是绕道ODBC…" 恭喜,这篇指南就是你的深夜急救包!🔥
PostgreSQL官方C接口库libpq
就像数据库的"母语":
// 举个栗子:其他方案要10行代码的查询,libpq只需3行 PGresult *res = PQexec(conn, "SELECT * FROM users WHERE age > 25");
# Ubuntu/Debian (2025年仍有效的命令) sudo apt install postgresql-server-dev-16 libpq-dev gcc-13 # Windows开发者注意: # 从PostgreSQL官网下载v16.x SDK时 # 务必勾选"Development Headers"选项
# Makefile示例(注意空格必须用Tab) target: g++ -std=c++23 main.cpp -I/usr/include/postgresql -lpq -o pg_demo
#include <libpq-fe.h> #include <iostream> int main() { PGconn *conn = PQconnectdb("host=127.0.0.1 dbname=test user=postgres password=123456"); if (PQstatus(conn) != CONNECTION_OK) { std::cerr << "💥 连接失败: " << PQerrorMessage(conn); PQfinish(conn); return 1; } std::cout << "🎉 连接成功!服务端版本: " << PQserverVersion(conn) << "\n"; // 记得释放连接! PQfinish(conn); return 0; }
// 使用PQconnectStart + PQconnectPoll实现非阻塞连接 PGconn *conn = PQconnectStart("dbname=video_stream"); if (PQstatus(conn) == CONNECTION_BAD) { /*...*/ } // 在事件循环中检查连接状态 PostgresPollingStatusType status; do { status = PQconnectPoll(conn); usleep(100000); // 等待100ms } while (status != PGRES_POLLING_OK);
const char *params[2] = {"admin@example.com", "25"}; PGresult *res = PQexecParams( conn, "UPDATE users SET status=$2 WHERE email=$1", 2, // 参数个数 NULL, // 参数类型(NULL自动推断) params, NULL, // 参数长度 NULL, // 参数格式(0=文本,1=二进制) 0 // 返回格式 ); if (PQresultStatus(res) != PGRES_COMMAND_OK) { std::cerr << "😱 更新失败: " << PQerrorMessage(conn); } PQclear(res);
// 插入图片到bytea字段 unsigned char img_data[1024*1024]; // 假设这是1MB的图片数据 const char *paramValues[1]; int paramLengths[1] = {sizeof(img_data)}; int paramFormats[1] = {1}; // 1表示二进制格式 paramValues[0] = (char *)img_data; PGresult *res = PQexecParams( conn, "INSERT INTO images(data) VALUES($1)", 1, NULL, paramValues, paramLengths, paramFormats, 0 );
PQsendQuery(conn, "SELECT * FROM large_table"); while (true) { if (PQconsumeInput(conn)) { // 非阻塞检查数据 if (PQisBusy(conn)) { // 结果未就绪 usleep(10000); continue; } PGresult *res = PQgetResult(conn); // 处理结果... } else { std::cerr << "数据接收错误\n"; break; } }
PQexec(conn, "LISTEN new_order_notification"); // 在事件循环中检查通知 PGnotify *notify; while ((notify = PQnotifies(conn)) != NULL) { printf("🔔 收到通知: %s (附加数据: %s)\n", notify->relname, notify->extra); PQfreemem(notify); }
PQexec()
返回的PGresult
必须用PQclear()
释放 PQsetnonblocking(conn, 1)
启用非阻塞模式 PQsetClientEncoding(conn, "UTF8")
防止中文乱码 PGOPTIONS="-c statement_timeout=5000"
设置5秒查询超时 :
现在你已掌握用C/C++直接操作PostgreSQL的核心技能!下次凌晨3点再遇到数据库问题时,你可以优雅地掏出libpq
这把瑞士军刀,而不是对着ODBC配置界面抓狂了~ 🎯
(本文代码示例基于PostgreSQL 16.3验证,最后更新:2025年7月)
本文由 哀大 于2025-07-31发表在【云服务器提供商】,文中图片由(哀大)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/498708.html
发表评论