涵盖数据库文件操作、SQL 语法基础,以及通过 Python 和 C++ 操作 SQLite 的完整指南。 --- ## 目录 1. **SQLite 简介** 2. **SQLite 安装与基础操作** 3. **SQL 语法快速指南** 4. **Python 操作 SQLite** 5. **C++ 操作 SQLite** 6. **高级主题与最佳实践** 7. **资源推荐** --- ## 1. SQLite 简介 - **特点**: - 轻量级、无服务器、零配置、单文件数据库。 - 支持 ACID 事务,兼容 SQL92 标准。 - 适用于嵌入式系统、移动应用和小型项目。 - **适用场景**: - 移动应用(Android/iOS)、桌面软件、小型 Web 应用、IoT 设备。 --- ## 2. SQLite 安装与基础操作 ### 安装 SQLite - **Windows**: 下载预编译二进制文件 [sqlite-tools](https://sqlite.org/download.html) 并配置环境变量。 - **Linux/macOS**: ```bash sudo apt-get install sqlite3 # Debian/Ubuntu brew install sqlite # macOS ``` ### 创建和管理数据库 ```bash # 创建或连接数据库 sqlite3 example.db # 查看所有表 .tables # 查看表结构 .schema # 退出命令行 .quit ``` --- ## 3. SQL 语法快速指南 ### 基本操作 ```sql -- 创建表 CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE ); -- 插入数据 INSERT INTO users (name, age, email) VALUES ('Alice', 30, 'alice@example.com'); -- 查询数据 SELECT * FROM users WHERE age > 25; -- 更新数据 UPDATE users SET age = 31 WHERE name = 'Alice'; -- 删除数据 DELETE FROM users WHERE id = 1; -- 创建索引 CREATE INDEX idx_users_email ON users(email); ``` ### 高级操作 ```sql -- 事务 BEGIN TRANSACTION; -- 执行多个操作 COMMIT; -- 或 ROLLBACK; -- 联合查询 (JOIN) SELECT orders.id, users.name FROM orders JOIN users ON orders.user_id = users.id; -- 聚合函数 SELECT COUNT(*), AVG(age) FROM users; ``` --- ## 4. Python 操作 SQLite ### 使用 `sqlite3` 模块 ```python import sqlite3 # 连接数据库(不存在则创建) conn = sqlite3.connect('example.db') cursor = conn.cursor() # 创建表 cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER ) ''') # 插入数据(参数化查询,防止 SQL 注入) cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25)) # 批量插入 users = [('Charlie', 30), ('David', 28)] cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users) # 查询数据 cursor.execute("SELECT * FROM users WHERE age > ?", (25,)) print(cursor.fetchall()) # 获取所有结果 # 提交事务 conn.commit() # 关闭连接 conn.close() ``` ### 使用上下文管理器 ```python with sqlite3.connect('example.db') as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM users") print(cursor.fetchone()) # 获取第一行 ``` --- ## 5. C++ 操作 SQLite ### 使用原生 C API ```cpp #include #include int main() { sqlite3 *db; int rc = sqlite3_open("example.db", &db); if (rc != SQLITE_OK) { std::cerr << "Error opening database: " << sqlite3_errmsg(db) << std::endl; return 1; } // 创建表 const char *sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);"; char *errMsg = nullptr; rc = sqlite3_exec(db, sql, 0, 0, &errMsg); if (rc != SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); } // 插入数据(参数化查询) sqlite3_stmt *stmt; const char *insertSql = "INSERT INTO users (name) VALUES (?);"; rc = sqlite3_prepare_v2(db, insertSql, -1, &stmt, nullptr); if (rc == SQLITE_OK) { sqlite3_bind_text(stmt, 1, "Alice", -1, SQLITE_STATIC); sqlite3_step(stmt); sqlite3_finalize(stmt); } // 查询数据 const char *selectSql = "SELECT id, name FROM users;"; rc = sqlite3_prepare_v2(db, selectSql, -1, &stmt, nullptr); while (sqlite3_step(stmt) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, 0); const char *name = reinterpret_cast(sqlite3_column_text(stmt, 1)); std::cout << "ID: " << id << ", Name: " << name << std::endl; } sqlite3_close(db); return 0; } ``` ### 使用第三方库(推荐) - **SQLiteCpp**(现代 C++ 封装): GitHub: https://github.com/SRombauts/SQLiteCpp ```cpp #include int main() { try { SQLite::Database db("example.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); db.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);"); SQLite::Statement insert(db, "INSERT INTO users (name) VALUES (?)"); insert.bind(1, "Alice"); insert.exec(); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` --- ## 6. 高级主题与最佳实践 ### 性能优化 - **启用 WAL 模式**: ```sql PRAGMA journal_mode=WAL; ``` - **批量操作使用事务**: ```python # Python 示例 with conn: cursor.executemany("INSERT ...", data_list) ``` ### 数据库维护 - **备份数据库**: ```bash sqlite3 example.db ".backup backup.db" ``` - **优化数据库文件**: ```sql VACUUM; ``` ### 常见问题 - **并发访问**: SQLite 支持多线程读,但写操作需串行化。 - **数据类型**: SQLite 使用动态类型(TEXT/INTEGER/REAL/BLOB/NULL)。 --- ## 7. 资源 - **官方文档**: https://sqlite.org/docs.html - **Python `sqlite3` 文档**: https://docs.python.org/3/library/sqlite3.html - **SQLiteCpp 库**: https://github.com/SRombauts/SQLiteCpp - **GUI 工具**: DB Browser for SQLite (https://sqlitebrowser.org/) ---