涵盖数据库文件操作、SQL 语法基础,以及通过 Python 和 C++ 操作 SQLite 的完整指南。
Linux/macOS:
sudo apt-get install sqlite3 # Debian/Ubuntu
brew install sqlite # macOS
# 创建或连接数据库
sqlite3 example.db
# 查看所有表
.tables
# 查看表结构
.schema <table_name>
# 退出命令行
.quit
-- 创建表
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);
-- 事务
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;
sqlite3 模块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()
with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchone()) # 获取第一行
#include <sqlite3.h>
#include <iostream>
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<const char*>(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
#include <SQLiteCpp/SQLiteCpp.h>
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;
}
启用 WAL 模式:
PRAGMA journal_mode=WAL;
批量操作使用事务:
# Python 示例
with conn:
cursor.executemany("INSERT ...", data_list)
备份数据库:
sqlite3 example.db ".backup backup.db"
优化数据库文件:
VACUUM;
sqlite3 文档: https://docs.python.org/3/library/sqlite3.html