SQLite 使用教程 1.md 5.8 KB

涵盖数据库文件操作、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 并配置环境变量。
  • Linux/macOS:

    sudo apt-get install sqlite3  # Debian/Ubuntu
    brew install sqlite          # macOS
    

创建和管理数据库

# 创建或连接数据库
sqlite3 example.db

# 查看所有表
.tables

# 查看表结构
.schema <table_name>

# 退出命令行
.quit

3. 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);

高级操作

-- 事务
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 模块

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())  # 获取第一行

5. C++ 操作 SQLite

使用原生 C API

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

6. 高级主题与最佳实践

性能优化

  • 启用 WAL 模式:

    PRAGMA journal_mode=WAL;
    
  • 批量操作使用事务:

    # Python 示例
    with conn:
      cursor.executemany("INSERT ...", data_list)
    

数据库维护

  • 备份数据库:

    sqlite3 example.db ".backup backup.db"
    
  • 优化数据库文件:

    VACUUM;
    

常见问题

  • 并发访问: SQLite 支持多线程读,但写操作需串行化。
  • 数据类型: SQLite 使用动态类型(TEXT/INTEGER/REAL/BLOB/NULL)。

7. 资源