SQLite 创建数据库
SQLite 创建数据库(2025 最新版)
SQLite 的核心理念:
数据库 = 一个文件
打开文件 = 创建数据库
无需 CREATE DATABASE 语句!
连接时自动创建 .db 文件。
一、创建数据库的 3 种方式
| 方式 | 命令 | 说明 |
|---|---|---|
| 1. 命令行直接创建 | sqlite3 mydb.db | 最常用 |
| 2. 编程方式创建 | Python/Node.js 等 | 开发中使用 |
| 3. 内存数据库 | :memory: | 临时测试 |
二、方式 1:命令行创建(推荐新手)
# 1. 创建并打开数据库
sqlite3 myapp.db
# 2. 自动进入 sqlite> 提示符
sqlite> .databases
seq name file
--- ----------- ----------------
0 main /path/to/myapp.db
sqlite> .quit
成功! myapp.db 文件已创建在当前目录。
三、方式 2:编程方式创建(Python 示例)
import sqlite3
# 自动创建数据库文件
conn = sqlite3.connect('myapp.db')
cursor = conn.cursor()
# 创建表(可选)
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)
''')
# 插入测试数据
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)",
('张三', 'zhangsan@example.com'))
conn.commit()
conn.close()
print("数据库 myapp.db 创建成功!")
运行后:当前目录生成
myapp.db文件
四、方式 3:内存数据库(临时)
sqlite3 :memory:
conn = sqlite3.connect(':memory:')
特点:
- 速度极快
- 程序关闭后消失
- 适合单元测试、临时计算
五、创建数据库完整流程(推荐)
# 1. 创建数据库
sqlite3 school.db
# 2. 创建表
sqlite> CREATE TABLE students (
...> id INTEGER PRIMARY KEY AUTOINCREMENT,
...> name TEXT NOT NULL,
...> class TEXT,
...> score INTEGER
...> );
# 3. 插入数据
sqlite> INSERT INTO students (name, class, score)
...> VALUES ('李四', '高一1班', 95);
# 4. 查询验证
sqlite> SELECT * FROM students;
1|李四|高一1班|95
# 5. 退出
sqlite> .quit
查看文件:
ls -lh school.db
# -rw-r--r-- 1 user staff 3.0K Nov 4 10:30 school.db
六、数据库文件结构(内部)
| 组件 | 说明 |
|---|---|
| B 树页面 | 存储表、索引 |
| WAL 文件 | mydb.db-wal(写前日志) |
| SHM 文件 | mydb.db-shm(共享内存) |
| Journal 文件 | mydb.db-journal(回滚日志) |
WAL 模式(推荐):
PRAGMA journal_mode = WAL;
七、常见问题与解决方案
| 问题 | 原因 | 解决 |
|---|---|---|
无法打开数据库文件 | 权限不足 | chmod 755 mydb.db |
数据库被锁定 | 多个进程写 | 使用 PRAGMA journal_mode=WAL; |
文件太大 | 频繁事务 | 定期 VACUUM; |
磁盘满 | BLOB 存储图片 | 存文件路径,不要存二进制 |
八、创建数据库最佳实践
-- 1. 开启外键
PRAGMA foreign_keys = ON;
-- 2. 使用 WAL 模式(高并发)
PRAGMA journal_mode = WAL;
-- 3. 设置合理缓存
PRAGMA cache_size = -20000; -- 20MB 缓存
-- 4. 启用严格模式(3.37+)
PRAGMA strict = ON;
-- 5. 创建表时加 DEFAULT
CREATE TABLE logs (
id INTEGER PRIMARY KEY,
message TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
);
保存为 init.sql:
sqlite3 mydb.db < init.sql
九、创建数据库速查表
| 操作 | 命令 |
|---|---|
| 创建文件数据库 | sqlite3 mydb.db |
| 创建内存数据库 | sqlite3 :memory: |
| 查看数据库路径 | .databases |
| 备份数据库 | .backup backup.db |
| 压缩数据库 | VACUUM; |
| 删除数据库 | rm mydb.db |
十、验证创建成功
# 方法1:命令行
sqlite3 mydb.db "SELECT name FROM sqlite_master WHERE type='table';"
# 方法2:文件存在
ls -la mydb.db
# 方法3:Python 检查
python -c "import sqlite3, os; print(os.path.getsize('mydb.db'))"
十一、GUI 工具创建数据库
| 工具 | 操作 |
|---|---|
| DB Browser for SQLite | File → New Database |
| DBeaver | 右键 SQLite → Create New Connection → 选择路径 |
| SQLiteStudio | Database → Add Database |
实战:创建学生管理系统数据库
# 1. 创建数据库
sqlite3 school.db
# 2. 执行以下 SQL
CREATE TABLE classes (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
class_id INTEGER,
FOREIGN KEY(class_id) REFERENCES classes(id)
);
INSERT INTO classes (name) VALUES ('高一1班'), ('高一2班');
INSERT INTO students (name, class_id) VALUES ('王五', 1);
SELECT s.name, c.name
FROM students s
JOIN classes c ON s.class_id = c.id;
.quit
学习建议
- 永远不要用
CREATE DATABASE - 数据库名建议小写 +
.db后缀 - 生产环境开启
WAL模式 - 定期备份:
cp mydb.db backup_$(date +%F).db
下一步学习? 回复:
创建表→ 完整建表语法导入数据→ CSV、JSON 导入Python 连接→ 完整项目模板备份恢复→ 防丢数据方案
现在就试试:
sqlite3 hello.db "SELECT '数据库创建成功!';"
看到输出就成功了!