sqlite3,一个轻量级的 C++ 数据库库!

宝子们,今天咱来唠唠 sqlite3 这个超棒的轻量级 C++ 数据库库。它就像是一个小巧但功能齐全的"数据仓库",能帮咱们轻松地存储、查询和管理数据,无论是开发小型的桌面应用,还是做一些简单的数据处理程序,它都能派上大用场,让咱们的程序数据管理变得井井有条。

一、数据库连接与创建

go 复制代码
#include <sqlite3.h>
#include <iostream>

int main() {
    // 声明一个数据库连接对象,就像准备打开一扇通往数据仓库的门
    sqlite3* db;
    // 尝试打开一个数据库文件,如果不存在就创建一个新的
    // 这里的 "test.db" 就是我们的数据库文件名,你可以换成自己喜欢的名字
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        // 如果打开失败,打印出错误信息,就像门打不开,看看是哪里出了问题
        std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
        return 1;
    } else {
        std::cout << "数据库打开成功!" << std::endl;
    }
    // 关闭数据库连接,就像离开仓库后要关好门
    sqlite3_close(db);
    return 0;
}

代码运行结果:如果一切顺利,控制台会输出"数据库打开成功!",并且在当前目录下会创建一个名为"test.db"的数据库文件(如果之前不存在的话)。如果打开失败,会输出错误信息,比如文件路径不对或者没有权限创建文件等情况。

小贴士:数据库文件名的路径要写对哦,不然就找不到或者创建不了数据库。而且在操作完数据库后,一定要记得关闭连接,就像用完东西要放回原位,不然可能会占用资源,导致程序出现问题。

二、创建表

go 复制代码
#include <sqlite3.h>
#include <iostream>

int main() {
    sqlite3* db;
    // 打开数据库
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
        return 1;
    }

    // 创建一个 SQL 语句,用来创建一个名为 "students" 的表
    // 这个表有 "id"(整数类型,主键,自动递增)、"name"(文本类型)和 "age"(整数类型)三个列
    const char* create_table_sql = "CREATE TABLE students ("
                                   "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                                   "name TEXT,"
                                   "age INTEGER"
                                   ");";
    // 执行 SQL 语句来创建表
    rc = sqlite3_exec(db, create_table_sql, 0, 0, 0);
    if (rc!= SQLITE_OK) {
        // 如果创建表失败,打印出错误信息
        std::cerr << "创建表失败: " << sqlite3_errmsg(db) << std::endl;
        sqlite3_close(db);
        return 1;
    } else {
        std::cout << "表创建成功!" << std::endl;
    }

    sqlite3_close(db);
    return 0;
}

代码运行结果:控制台会输出"表创建成功!",此时在"test.db"数据库中就有了一个名为"students"的空表,准备好存储学生的信息。

小贴士:写 SQL 语句的时候要特别小心语法错误,一个小标点或者关键字写错,表就创建不出来了。可以多检查几遍,或者参考一些 SQL 语法的资料,确保语句正确无误。

三、插入数据

go 复制代码
#include <sqlite3.h>
#include <iostream>

int main() {
    sqlite3* db;
    // 打开数据库
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
        return 1;
    }

    // 插入数据的 SQL 语句,往 "students" 表里插入一条学生信息
    const char* insert_sql = "INSERT INTO students (name, age) VALUES ('小明', 18);";
    rc = sqlite3_exec(db, insert_sql, 0, 0, 0);
    if (rc!= SQLITE_OK) {
        // 如果插入数据失败,打印出错误信息
        std::cerr << "插入数据失败: " << sqlite3_errmsg(db) << std::endl;
        sqlite3_close(db);
        return 1;
    } else {
        std::cout << "数据插入成功!" << std::endl;
    }

    sqlite3_close(db);
    return 0;
}

代码运行结果:控制台会输出"数据插入成功!",这样就在"students"表中插入了一条名为"小明",年龄为 18 岁的学生记录。

小贴士:插入的数据值要和表的列类型匹配哦,不然也会出错。比如这里的名字要用单引号括起来,因为它是文本类型,年龄是整数类型就直接写数字。

四、查询数据

go 复制代码
#include <sqlite3.h>
#include <iostream>

int callback(void* data, int argc, char** argv, char** azColName) {
    // 这个回调函数用来处理查询结果,会逐行打印出每列的名称和值
    for (int i = 0; i < argc; ++i) {
        std::cout << azColName[i] << " = " << argv[i] << std::endl;
    }
    std::cout << "-----------------" << std::endl;
    return 0;
}

int main() {
    sqlite3* db;
    // 打开数据库
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;
        return 1;
    }

    // 查询数据的 SQL 语句,从 "students" 表中查询所有记录
    const char* select_sql = "SELECT * FROM students;";
    rc = sqlite3_exec(db, select_sql, callback, 0, 0);
    if (rc!= SQLITE_OK) {
        // 如果查询失败,打印出错误信息
        std::cerr << "查询数据失败: " << sqlite3_errmsg(db) << std::endl;
        sqlite3_close(db);
        return 1;
    }

    sqlite3_close(db);
    return 0;
}

代码运行结果:如果之前成功插入了数据,控制台会输出:

go 复制代码
id = 1
name = 小明
age = 18
-----------------

这里的"1"是自动递增的主键值。如果表中还有其他数据,也会逐行输出。

小贴士 :回调函数的参数要理解清楚哦,argc 是列的数量,argv 是每列的值,azColName 是每列的名称。通过这个回调函数,我们可以灵活地处理查询到的数据,比如把它存储到一个数组或者结构体中,方便后续的使用。

五、实际应用场景

假如我们要开发一个小型的图书管理系统,就可以用 sqlite3 来存储图书的信息,像书名、作者、出版社、出版日期、库存数量等。通过创建相应的表,插入图书的记录,然后在需要查询图书信息、统计库存、办理借阅和归还手续等操作时,使用 sqlite3 的查询和更新语句来实现。这样一个简单的数据库就能让整个图书管理系统的数据管理变得有序且高效,方便管理员和读者的使用。

再比如,做一个简单的记账软件,用 sqlite3 存储每笔收支的金额、日期、分类、备注等信息。通过查询和统计功能,可以方便地查看每月的收支情况、各类支出的占比等,帮助用户更好地管理自己的财务状况。

六、实践练习

  1. 在"students"表中再插入两条不同的学生记录,然后查询出所有年龄大于 18 岁的学生信息。

  2. 给"students"表添加一个"score"列(浮点数类型),用来存储学生的成绩,然后更新之前插入的学生记录的成绩值,最后查询出所有学生的信息,包括成绩。

宝子们,sqlite3 的功能远不止这些,还有很多高级的用法和技巧等着大家去探索。多动手敲敲代码,尝试不同的操作,才能真正掌握它哦。

今天的 C++ 学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,C++ 学习节节高!

相关推荐
hanbarger3 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
波音彬要多做10 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
捕鲸叉11 分钟前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
Swift社区18 分钟前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光22 分钟前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
微服务 spring cloud24 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
矛取矛求27 分钟前
QT的前景与互联网岗位发展
开发语言·qt
先睡27 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Leventure_轩先生27 分钟前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt