SQLite数据库应用

市面上有很多数据库应用,常见的有MySQL、PostgreSQL关系型数据库(以表格形式存储数据),支持SQL语言,具备强一致性和事务支持,适合结构化数据。 以及非关系型数据库(以文档、键值、列族、图等为存储结构)MongoDB、Cassandra等,具备高扩展性和灵活性。

一、SQLite介绍

SQLite是一种轻量级的关系型数据库管理系统,它是一个C语言库,通过SQL接口提供数据库管理功能。与许多传统的数据库系统不同,SQLite不需要服务器进程或系统来运行,而是将整个数据库存储在一个单独的文件中,因此特别适合嵌入式应用和资源受限的环境。

特性 SQLite MySQL
架构 嵌入式数据库(无服务器) 客户端-服务器架构
性能 适用于小型应用和低并发场景 适合高并发、大数据量的应用
并发性 支持读取并发,但写操作有限制 高并发支持,支持多线程和多进程
功能 基本 SQL、ACID 事务,缺少存储过程 完整的 SQL 支持、存储过程、触发器
部署 无需安装服务器,直接复制数据库文件 需要安装和配置数据库服务器
维护 简单,数据库文件即可备份和恢复 需要管理数据库实例、权限等
适用场景 小型应用、嵌入式设备、移动应用 Web 应用、在线服务、企业应用
跨平台支持 支持多平台(Windows, Linux, macOS) 支持多平台(Windows, Linux, macOS)
并发写入 限制,适用于低并发写入 强大的并发写入支持
功能扩展 不支持存储过程和触发器 支持存储过程、触发器、外键等

二、SQLite C/C++应用

2.1 在Windows上安装SQLite

SQLite下载页面,从Windows区下载预编译的二进制文件。

下载sqlite-dll-win-x64-3490100.zip和sqlite-tools-win-x64-3490100.zip压缩文件。

创建文件夹D:\sqlite,并在此文件夹下解压上面两个压缩文件。

添加D:\sqlite到PATH环境变量,最后在命令提示符下,使用sqlite3命令,将显示如下结果。

C:\Users\GAI>sqlite3
SQLite version 3.49.1 2025-02-18 13:38:58
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

2.2 DB Browser for SQLite

DB Browser for SQLite(https://sqlitebrowser.org/)

SQLite 数据库浏览器(DB4S) 是一款高质量、可视化的开源工具,专为想要创建、搜索和编辑 SQLite或SQLCipher数据库文件的用户而设计。DB4S 除了提供完整的 SQL 查询功能外,还提供了熟悉的电子表格式数据库界面。它适用于Windows、 macOS以及大多数版本的Linux 和Unix。

2.3 SQLite依赖

在Windows上,只需要将SQLite的动态库sqlite3.dll链接到项目中,基本上就可以直接使用

2.4 SQLite C/C++接口

下载sqlite-amalgamation-3490100.zip可以获取sqlite3头文件

SQLite提供了丰富的C/C++ API来操作数据库。

下面是一些常用的SQLite API,包含一些增、删、查、改(CRUD)基础操作。详细参考SQLite 官方文档

#include <sqlite3.h>
#include <iostream>

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

// 创建表
int createTable(sqlite3* db) {
    const char* sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER);";
    char* errMsg = 0;
    int rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "创建表失败: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }
    return SQLITE_OK;
}

// 插入数据
int insertData(sqlite3* db) {
    const char* sql = "INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 25), ('Charlie', 35);";
    char* errMsg = 0;
    int rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "插入数据失败: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }
    return SQLITE_OK;
}

// 查询数据
int queryData(sqlite3* db) {
    const char* sql = "SELECT id, name, age FROM users;";
    sqlite3_stmt* stmt;
    int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
    if (rc != SQLITE_OK) {
        std::cerr << "查询数据失败: " << sqlite3_errmsg(db) << std::endl;
        return rc;
    }

    while (sqlite3_step(stmt) == SQLITE_ROW) {
        int id = sqlite3_column_int(stmt, 0);
        const char* name = (const char*)sqlite3_column_text(stmt, 1);
        int age = sqlite3_column_int(stmt, 2);
        std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;
    }

    sqlite3_finalize(stmt);
    return SQLITE_OK;
}

// 更新数据
int updateData(sqlite3* db) {
    const char* sql = "UPDATE users SET age = 32 WHERE name = 'Alice';";
    char* errMsg = 0;
    int rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "更新数据失败: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }
    return SQLITE_OK;
}

// 删除数据
int deleteData(sqlite3* db) {
    const char* sql = "DELETE FROM users WHERE name = 'Bob';";
    char* errMsg = 0;
    int rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "删除数据失败: " << errMsg << std::endl;
        sqlite3_free(errMsg);
        return rc;
    }
    return SQLITE_OK;
}

// 关闭数据库
void closeDatabase(sqlite3* db) {
    sqlite3_close(db);
    std::cout << "数据库已关闭" << std::endl;
}

int main() {
    sqlite3* db;

    // 打开数据库
    if (openDatabase(db) != SQLITE_OK) return 1;

    // 创建表
    if (createTable(db) != SQLITE_OK) return 1;

    // 插入数据
    if (insertData(db) != SQLITE_OK) return 1;

    // 查询数据
    std::cout << "查询数据:" << std::endl;
    if (queryData(db) != SQLITE_OK) return 1;

    // 更新数据
    if (updateData(db) != SQLITE_OK) return 1;

    // 查询更新后的数据
    std::cout << "查询更新后的数据:" << std::endl;
    if (queryData(db) != SQLITE_OK) return 1;

    // 删除数据
    if (deleteData(db) != SQLITE_OK) return 1;

    // 查询删除后的数据
    std::cout << "查询删除后的数据:" << std::endl;
    if (queryData(db) != SQLITE_OK) return 1;

    // 关闭数据库
    closeDatabase(db);
    return 0;
}

results matching ""

    No results matching ""