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;
}