随机
Enter 搜索 ↑↓ 切换 Esc 清空

sqlite3

命令

SQLite 数据库命令行工具

sqlite3

SQLite 数据库命令行工具

补充说明

sqlite3 是 SQLite 数据库的命令行管理工具,用于创建、查询、管理 SQLite 数据库文件。SQLite 是轻量级的嵌入式数据库,无需服务器,单文件存储。

语法

sqlite3 [OPTIONS] [FILENAME] [SQL]

命令选项

-init FILE        # 初始化时执行文件
-h FILE           # 数据库文件(同参数)
-bail             # 首次错误时退出
-batch            # 批处理模式
-column           # 列模式输出
-csv              # CSV 格式输出
-header           # 显示列头
-noheader         # 不显示列头
-echo             # 显示执行的 SQL
-nullvalue STR    # NULL 值显示为 STR
-separator SEP    # 设置分隔符
-version          # 显示版本
-help             # 显示帮助

基本使用

# 创建/打开数据库
sqlite3 mydb.db
sqlite3 /path/to/database.db

# 打开内存数据库
sqlite3 :memory:

# 执行 SQL 后退出
sqlite3 mydb.db "SELECT * FROM users;"

# 执行 SQL 文件
sqlite3 mydb.db < script.sql

# 导入 CSV
sqlite3 mydb.db <<EOF
.mode csv
.import data.csv mytable
EOF

# 导出为 CSV
sqlite3 mydb.db <<EOF
.mode csv
.headers on
.output data.csv
SELECT * FROM users;
EOF

点命令

# 帮助
.help

# 数据库相关
.databases              # 列出所有数据库
.open FILE             # 打开数据库
.open ':memory:'       # 打开内存数据库
.save FILE             # 保存内存数据库到文件
.clone NEWDB           # 克隆数据库

# 表相关
.tables [PATTERN]      # 列出表
.schema [TABLE]        # 显示表结构
.indices [TABLE]       # 列出索引
.type TABLE            # 查看表类型

# 格式化输出
.mode MODE             # 设置输出模式
  csv                   # CSV 格式
  column                # 列对齐
  list                  # 列表(默认)
  html                  # HTML 表格
  insert                # INSERT 语句
  line                  # 每行一行
  tabs                   # 制表符分隔
  tcl                    # TCL 列表

.headers ON|OFF        # 显示/隐藏列头
.separator SEP         # 设置分隔符
.nullvalue STR         # NULL 值显示
.width N N N           # 设置列宽
.output FILE           # 输出到文件
.output                # 输出到屏幕
.once FILE             # 输出到文件一次
.echo ON|OFF           # 显示执行的命令

# 导入导出
.import FILE TABLE     # 导入 CSV 到表
.dump [TABLE]          # 导出为 SQL
.load FILE             # 加载扩展

# 显示信息
.show                  # 显示当前设置
.stats ON|OFF          # 显示统计

# 其他
.quit                  # 退出
.exit                  # 退出
.system CMD            # 执行系统命令
.read FILE             # 执行 SQL 文件
.timer ON|OFF          # 计时

数据库操作

-- 创建表
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  email TEXT UNIQUE,
  age INTEGER DEFAULT 0,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建带索引的表
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price REAL,
  category TEXT
);
CREATE INDEX idx_category ON products(category);

-- 查看所有表
.tables
SELECT name FROM sqlite_master WHERE type='table';

-- 查看表结构
.schema users
PRAGMA table_info(users);

-- 删除表
DROP TABLE users;
DROP TABLE IF EXISTS users;

-- 修改表(SQLite 限制较多)
ALTER TABLE users ADD COLUMN phone TEXT;
ALTER TABLE users RENAME TO members;

数据操作

-- 插入数据
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@example.com', 28);
INSERT INTO users (name, email) VALUES 
  ('李四', 'lisi@example.com'),
  ('王五', 'wangwu@example.com');

-- 查询数据
SELECT * FROM users;
SELECT name, email FROM users WHERE age >= 25;
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
SELECT DISTINCT category FROM products;

-- 更新数据
UPDATE users SET age = 29 WHERE name = '张三';
UPDATE users SET age = age + 1;

-- 删除数据
DELETE FROM users WHERE id = 1;
DELETE FROM users WHERE age < 18;
DELETE FROM users;  -- 清空表

-- 聚合查询
SELECT COUNT(*) FROM users;
SELECT age, COUNT(*) FROM users GROUP BY age;
SELECT category, AVG(price) FROM products GROUP BY category;

导入导出

# 导出整个数据库为 SQL
sqlite3 mydb.db .dump > backup.sql

# 导出单表
sqlite3 mydb.db "dump users" > users.sql

# 导入 SQL 文件恢复
sqlite3 newdb.db < backup.sql

# 导出为 CSV
sqlite3 mydb.db <<EOF
.mode csv
.headers on
.output users.csv
SELECT * FROM users;
.quit
EOF

# 导入 CSV
sqlite3 mydb.db <<EOF
.mode csv
.import users.csv users
.quit
EOF

# 导出为 JSON(需要扩展)
sqlite3 mydb.db <<EOF
.mode list
.separator ,
.output users.txt
SELECT * FROM users;
.quit
EOF

实用技巧

# 查看数据库大小
ls -lh mydb.db

# 压缩数据库
sqlite3 mydb.db "VACUUM;"
sqlite3 mydb.db "VACUUM INTO 'mydb_copy.db';"

# 检查数据库完整性
sqlite3 mydb.db "PRAGMA integrity_check;"

# 分析查询
sqlite3 mydb.db "EXPLAIN QUERY PLAN SELECT * FROM users WHERE age > 25;"

# 查看数据库配置
sqlite3 mydb.db "PRAGMA database_list;"

# 加密数据库(需要 SEE 版本)
sqlite3 mydb.db "PRAGMA key='password';"

# 查看编译选项
sqlite3 :memory: "SELECT * FROM pragma_compile_options;"

# 查看版本
sqlite3 --version

# 交互模式美化输出
sqlite3 mydb.db <<EOF
.mode column
.headers on
.width 5 20 30 5
SELECT * FROM users LIMIT 5;
EOF

# 批处理脚本
cat <<EOF | sqlite3 mydb.db
CREATE TABLE IF NOT EXISTS config (key TEXT, value TEXT);
INSERT INTO config VALUES ('version', '1.0');
INSERT INTO config VALUES ('created', datetime('now'));
SELECT * FROM config;
EOF

常见问题

-- 开启外键约束(默认关闭)
PRAGMA foreign_keys = ON;

-- 查看外键状态
PRAGMA foreign_keys;

-- 查看表信息
PRAGMA table_info(users);

-- 查看索引
PRAGMA index_list(users);

-- 优化数据库
PRAGMA optimize;

-- 设置缓存大小
PRAGMA cache_size = 10000;

-- 设置临时存储
PRAGMA temp_store = MEMORY;

Python 操作示例

import sqlite3

# 连接数据库
conn = sqlite3.connect('mydb.db')
cursor = conn.cursor()

# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT
)
''')

# 插入数据
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", 
               ('张三', 'zhangsan@example.com'))

# 批量插入
users = [('李四', 'lisi@example.com'), ('王五', 'wangwu@example.com')]
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", users)

# 查询
cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
    print(row)

# 提交并关闭
conn.commit()
conn.close()