在C++中处理数据库:PostgreSQL与MongoDB实战

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么C++开发者需要数据库?

C++是最强大的系统编程语言之一。然而,即使在高负载项目中,也几乎不可能不保存数据。无论是游戏服务器、金融应用还是物联网系统,您都需要一个可靠的存储方案。在本文中,我们将探讨两种流行的方法:关系型数据库管理系统PostgreSQL和面向文档的MongoDB。您将学习如何将它们连接到C++项目,执行基本操作并避免常见错误。



1. C++中的PostgreSQL:关系型数据库的经典之选

PostgreSQL是一款成熟、可靠的数据库管理系统,对事务和复杂查询有出色的支持。在C++中与之交互,最常用的库是libpqxx——它是libpq的官方C++封装器。



安装与链接

通过包管理器安装libpqxx,或从源码编译:

# Ubuntu/Debiansudo apt-get install libpqxx-dev

# macOS (Homebrew)brew install libpqxx

在CMakeLists.txt中添加:

find_package(PQXX REQUIRED)target_link_libraries(your_project pqxx::pqxx)


连接数据库与简单SELECT查询

来看一个最小示例——获取用户列表:

#include <iostream>#include <pqxx/pqxx>

int main() { try { // 连接字符串:"host=... dbname=... user=... password=..." pqxx::connection conn("host=localhost dbname=testdb user=admin password=secret"); pqxx::work txn(conn);

// 执行查询 pqxx::result result = txn.exec("SELECT id, name, email FROM users LIMIT 10");

for (auto row : result) { std::cout << "ID: " << row[0].as<int>() << ", Name: " << row[1].as<std::string>() << ", Email: " << row[2].as<std::string>() << std::endl; }

txn.commit(); // 提交事务 } catch (const std::exception &e) { std::cerr << "错误: " << e.what() << std::endl; return 1; } return 0;}

请注意:所有操作都包裹在try-catch块中——libpqxx在任何故障时都会抛出异常。



参数化查询(安全性)

永远不要通过拼接字符串来替换值——这会为SQL注入打开大门。请使用预处理语句:

pqxx::work txn(conn);// 准备conn.prepare("insert_user", "INSERT INTO users (name, email) VALUES ($1, $2)");

// 带参数执行txn.exec_prepared("insert_user", "伊万·彼得罗夫", "ivan@example.com");txn.commit();


2. C++中的MongoDB:NoSQL的灵活性

MongoDB以BSON(二进制JSON)格式存储数据,非常适合数据模式可能变化的场景。官方的C++驱动是mongocxx(基于mongoc)。



安装mongocxx驱动

从源码编译是最可靠的方式。简要说明:

# 安装依赖:libmongoc, libbson, cmakegit clone https://github.com/mongodb/mongo-cxx-driver.gitcd mongo-cxx-driver/buildcmake .. -DCMAKE_BUILD_TYPE=Release -DBSONCXX_POLY_USE_MNMLSTC=ONmake -j4sudo make install

在CMakeLists.txt中:

find_package(libmongocxx REQUIRED)target_link_libraries(your_project mongocxx::mongocxx)


连接与插入文档

#include <iostream>#include <bsoncxx/json.hpp>#include <mongocxx/client.hpp>#include <mongocxx/instance.hpp>#include <mongocxx/uri.hpp>

int main() { // 初始化驱动(每个应用程序一次) mongocxx::instance inst{};

// 连

博客

书籍推荐