在C++中操作数据库:PostgreSQL和MongoDB入门指南

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

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

开始课程

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

C++是最强大的编程语言之一,用于构建高负载系统、游戏、金融应用和嵌入式软件。然而,任何严肃的应用都需要数据存储。这时,数据库管理系统(DBMS)就派上了用场。

在本文中,我们将探讨如何使用C++连接并执行两种流行数据库——关系型PostgreSQL和文档型MongoDB——的基本操作。本文面向已掌握C++基础但尚未接触过数据库的初级开发者。您将学习如何安装所需库、编写简单的CRUD查询以及避免常见错误。

1. 环境准备与库的选择

在编写代码之前,需要安装用于操作数据库的客户端库。C++有多种选择,但我们将介绍最流行且稳定的两种:

  • 针对PostgreSQL — libpqxx(libpq的官方C++封装)。
  • 针对MongoDB — mongocxx(MongoDB官方C++驱动)。

安装libpqxx(Ubuntu/Debian)

sudo apt-get update
sudo apt-get install libpqxx-dev

对于Windows或macOS,请使用vcpkg或Homebrew包管理器。

安装mongocxx

首先安装基础驱动mongo-c-driver,然后安装C++驱动:

# Ubuntu
sudo apt-get install libmongoc-dev libbson-dev
sudo apt-get install libmongocxx-dev

安装后,确保编译器能找到头文件。编译时不要忘记指定链接标志:

g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson

2. 在C++中使用PostgreSQL

PostgreSQL是一个强大的对象关系型数据库管理系统。我们将使用libpqxx库,它提供了便捷的C++接口。

连接服务器并创建表

首先编写一个简单的程序,连接到本地数据库并创建用户表:

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

int main() {
    try {
        // 以用户"postgres"身份连接到数据库"testdb"
        pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret");
        if (conn.is_open()) {
            std::cout << "成功连接到PostgreSQL!" << std::endl;
        }

        // 创建事务
        pqxx::work txn(conn);

        // 创建表的SQL查询
        txn.exec("CREATE TABLE IF NOT EXISTS users ("
                 "id SERIAL PRIMARY KEY,"
                 "name VARCHAR(100) NOT NULL,"
                 "email VARCHAR(100) UNIQUE NOT NULL);");

        txn.commit(); // 提交更改
        std::cout << "users表已创建。" << std::endl;

    } catch (const std::exception &e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}

CRUD操作:插入和读取数据

添加一些记录并执行查询:

pqxx::work txn(conn);

// 插入数据
txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);",
                "伊万·彼得罗夫", "ivan@example.com");
txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);",
                "玛丽亚·斯米尔诺娃", "maria@example.com");
txn.commit();

// 读取数据
pqxx::nontransaction ntxn(conn);
pqxx::result result = ntxn.exec("SELECT id, name, email FROM users;");

for (auto row : result) {
    std::cout << "ID: " << row[0].as<int>()
              << ", 姓名: " << row[1].as<std::string>()
              << ", 邮箱: " <<                

博客

书籍推荐