1. 首页 > sqlite教程 > 正文

sqlite教程FG003-安装、命令行与基础CRUD实战

本文档风哥主要介绍sqlite数据库安装、命令行与基础CRUD实战相关知识,包括sqlite数据库安装方式、命令行工具使用、CRUD操作基础、安装规划建议、命令行配置等内容,风哥教程参考sqlite官方文档How To Compile SQLite、The SQLite Command-Line Shell等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 sqlite数据库安装方式概述

sqlite数据库提供了多种安装方式,可以根据不同的操作系统和使用场景选择合适的安装方法。更多视频教程www.fgedu.net.cn

1.1.1 sqlite数据库安装方式分类

sqlite数据库安装方式:

1. 包管理器安装(推荐新手)
├── Linux: yum/apt/dnf
├── macOS: brew
└── Windows: chocolatey/scoop

2. 预编译二进制安装
├── 下载官方预编译包
├── 解压到指定目录
└── 配置环境变量

3. 源码编译安装(推荐生产环境)
├── 下载源码包
├── 配置编译选项
├── 编译安装
└── 验证安装结果

4. 编程语言内置
├── Python: sqlite3模块(内置)
├── Node.js: better-sqlite3
└── Java: JDBC驱动

1.1.2 sqlite数据库安装文件说明

sqlite数据库官方下载文件说明:

源码包:
├── sqlite-autoconf-XXX.tar.gz # 自动配置源码包(推荐)
├── sqlite-amalgamation-XXX.zip # 合并源码包
└── sqlite-src-XXX.zip # 完整源码包

预编译包:
├── sqlite-tools-linux-x64-XXX.zip # Linux命令行工具
├── sqlite-tools-win-x64-XXX.zip # Windows命令行工具
└── sqlite-tools-osx-x64-XXX.zip # macOS命令行工具

合并源码文件:
├── sqlite3.c # 合并后的C源码(约25万行)
├── sqlite3.h # 头文件
├── sqlite3ext.h # 扩展头文件
└── shell.c # 命令行工具源码

1.2 sqlite数据库命令行工具介绍

sqlite3命令行工具是sqlite数据库的核心管理工具,提供了丰富的交互式操作功能。学习交流加群风哥微信: itpux-com

1.2.1 sqlite3命令行工具功能

sqlite3命令行工具主要功能:

数据库管理:
├── 创建数据库
├── 打开数据库
├── 备份数据库
├── 导入导出数据
└── 数据库维护

SQL执行:
├── 执行SQL语句
├── 执行SQL脚本文件
├── 格式化输出结果
└── 执行计划分析

元数据查询:
├── 查看表结构
├── 查看索引信息
├── 查看数据库信息
└── 查看PRAGMA设置

数据导入导出:
├── CSV格式导入导出
├── SQL脚本导入导出
├── JSON格式支持
└── 自定义格式输出

1.2.2 sqlite3命令行常用命令

sqlite3命令行常用命令分类:

数据库操作命令:
.open FILENAME 打开数据库文件
.databases 列出所有数据库
.backup FILENAME 备份数据库
.restore FILENAME 恢复数据库

表操作命令:
.tables 列出所有表
.schema TABLE 显示表结构
.indices TABLE 显示表索引
.dump TABLE 导出表数据

输出格式命令:
.mode MODE 设置输出模式
.headers ON|OFF 显示/隐藏列名
.separator STRING 设置分隔符
.width N1 N2… 设置列宽

帮助命令:
.help 显示帮助信息
.show 显示当前设置
.version 显示版本信息

1.3 sqlite数据库CRUD操作基础

CRUD(Create、Read、Update、Delete)是数据库操作的基础,sqlite完全支持标准的SQL语法进行CRUD操作。更多学习教程公众号风哥教程itpux_com

1.3.1 sqlite数据库CRUD操作语法

sqlite数据库CRUD操作基础语法:

Create(创建):
INSERT INTO table_name (column1, column2, …)
VALUES (value1, value2, …);

Read(读取):
SELECT column1, column2, …
FROM table_name
WHERE condition;

Update(更新):
UPDATE table_name
SET column1 = value1, column2 = value2, …
WHERE condition;

Delete(删除):
DELETE FROM table_name
WHERE condition;

DDL(数据定义语言):
CREATE TABLE table_name (…);
ALTER TABLE table_name …;
DROP TABLE table_name;

Part02-生产环境规划与建议

2.1 sqlite数据库安装规划建议

在生产环境中安装sqlite数据库,需要提前做好规划,确保安装过程顺利。风哥提示:生产环境建议使用源码编译安装,可以自定义编译选项。

2.1.1 安装前准备工作

sqlite数据库安装前准备清单:

系统环境检查:
├── 操作系统版本确认
├── 系统架构确认(x86_64/ARM)
├── 磁盘空间检查(至少500MB)
└── 内存检查(至少256MB)

依赖软件检查:
├── GCC编译器(源码编译需要)
├── Make工具(源码编译需要)
├── Readline库(命令行编辑支持)
└── Zlib库(压缩支持)

目录规划:
├── 安装目录:/sqlite/app
├── 数据目录:/sqlite/fgdata
├── 日志目录:/sqlite/logs
└── 脚本目录:/sqlite/scripts

用户权限规划:
├── 创建sqlite用户
├── 配置sudo权限
└── 设置目录权限

2.1.2 编译选项规划

sqlite数据库编译选项建议:

生产环境推荐编译选项:
./configure \
–prefix=/sqlite/app \ # 安装路径
–enable-static \ # 启用静态库
–enable-shared \ # 启用动态库
–enable-threadsafe \ # 启用线程安全
–enable-dynamic-extensions \ # 启用动态扩展
CFLAGS=”-DSQLITE_ENABLE_FTS5 \ # 启用FTS5全文检索
-DSQLITE_ENABLE_JSON1 \ # 启用JSON支持
-DSQLITE_ENABLE_RTREE \ # 启用R树索引
-DSQLITE_MAX_PAGE_SIZE=65536 \ # 最大页面大小
-DSQLITE_MAX_PAGE_COUNT=4294967294″ # 最大页数

性能优化编译选项:
CFLAGS=”-O2 -DSQLITE_ENABLE_FTS5 \
-DSQLITE_ENABLE_JSON1 \
-DSQLITE_THREADSAFE=1 \
-DSQLITE_DEFAULT_CACHE_SIZE=-64000 \
-DSQLITE_DEFAULT_WAL_AUTOCHECKPOINT=1000″

2.2 sqlite数据库命令行配置建议

sqlite3命令行工具可以通过配置文件和启动参数进行个性化配置。学习交流加群风哥QQ113257174

2.2.1 命令行配置文件

sqlite3命令行配置文件:

配置文件位置:
~/.sqliterc # 用户级配置文件

配置文件示例:
$ cat ~/.sqliterc
— sqlite3 配置文件
— from:www.itpux.com.qq113257174.wx:itpux-com

— 显示列名
.headers on

— 设置输出模式
.mode column

— 设置分隔符
.separator |

— 显示行数
.timer on

— 设置NULL值显示
.nullvalue NULL

— 设置列宽
.width 10 20 30 15

— 启用外键约束
PRAGMA foreign_keys=ON;

— 设置WAL模式
PRAGMA journal_mode=WAL;

2.2.2 命令行启动参数

sqlite3命令行启动参数:

常用启动参数:
sqlite3 [OPTIONS] [FILENAME [SQL]]

选项说明:
-bail 错误后停止
-batch 批处理模式
-column 列模式输出
-cmd COMMAND 执行命令
-csv CSV模式输出
-header 显示列名
-help 显示帮助
-html HTML模式输出
-init FILE 初始化文件
-line 行模式输出
-list 列表模式输出
-mmap N 设置mmap大小
-newline SEP 设置换行符
-nullvalue STR 设置NULL显示
-separator SEP 设置分隔符
-version 显示版本

使用示例:
$ sqlite3 -header -column -cmd “.width 10 20” fgedudb.db “SELECT * FROM fgedu_users;”

2.3 sqlite数据库CRUD操作设计建议

进行CRUD操作时,需要遵循一定的设计规范,确保数据安全和操作效率。更多视频教程www.fgedu.net.cn

2.3.1 表设计规范

sqlite数据库表设计规范:

主键设计:
├── 使用INTEGER PRIMARY KEY
├── 利用ROWID自动递增
├── 避免使用UUID作为主键
└── 主键名称建议使用id

字段类型选择:
├── INTEGER:整数、布尔值
├── TEXT:字符串、日期时间
├── REAL:浮点数
├── BLOB:二进制数据
└── NUMERIC:数值类型

约束设计:
├── NOT NULL:非空约束
├── UNIQUE:唯一约束
├── DEFAULT:默认值
├── CHECK:检查约束
└── FOREIGN KEY:外键约束

命名规范:
├── 表名:小写字母,下划线分隔
├── 字段名:小写字母,下划线分隔
├── 索引名:idx_表名_字段名
└── 主键名:pk_表名

Part03-生产环境项目实施方案

3.1 sqlite数据库安装实施

以下是在Oracle Linux 9.3系统上安装sqlite数据库的详细步骤。学习交流加群风哥微信: itpux-com

3.1.1 系统环境准备

检查系统环境:
$ cat /etc/os-release
NAME=”Oracle Linux Server”
VERSION=”9.3″
ID=”ol”
ID_LIKE=”fedora”
VERSION_ID=”9.3″

检查系统架构:
$ uname -m
x86_64

检查磁盘空间:
$ df -h /sqlite
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 100G 5.0G 95G 5% /sqlite

安装依赖软件:
$ sudo dnf install -y gcc make readline-devel zlib-devel
Last metadata expiration check: 0:01:23 ago on Mon 08 Apr 2024 10:00:00 AM CST.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
gcc x86_64 11.3.1-4.3.0.1.el9 ol9_appstream 31 M
make x86_64 4.3-7.el9 ol9_baseos_latest 539 k
readline-devel x86_64 8.1-4.el9 ol9_appstream 157 k
zlib-devel x86_64 1.2.11-40.el9 ol9_appstream 44 k

Transaction Summary
================================================================================
Install 4 Packages

Total download size: 32 M
Installed size: 98 M
Downloading Packages:
(1/4): gcc-11.3.1-4.3.0.1.el9.x86_64.rpm 11 MB/s | 31 MB 00:02
(2/4): make-4.3-7.el9.x86_64.rpm 2.5 MB/s | 539 kB 00:00
(3/4): readline-devel-8.1-4.el9.x86_64.rpm 1.8 MB/s | 157 kB 00:00
(4/4): zlib-devel-1.2.11-40.el9.x86_64.rpm 500 kB/s | 44 kB 00:00
——————————————————————————–
Total 12 MB/s | 32 MB 00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : zlib-devel-1.2.11-40.el9.x86_64 1/4
Installing : readline-devel-8.1-4.el9.x86_64 2/4
Installing : make-4.3-7.el9.x86_64 3/4
Installing : gcc-11.3.1-4.3.0.1.el9.x86_64 4/4
Running scriptlet: gcc-11.3.1-4.3.0.1.el9.x86_64 4/4
Verifying : gcc-11.3.1-4.3.0.1.el9.x86_64 1/4
Verifying : make-4.3-7.el9.x86_64 2/4
Verifying : readline-devel-8.1-4.el9.x86_64 3/4
Verifying : zlib-devel-1.2.11-40.el9.x86_64 4/4

Installed:
gcc-11.3.1-4.3.0.1.el9.x86_64 make-4.3-7.el9.x86_64
readline-devel-8.1-4.el9.x86_64 zlib-devel-1.2.11-40.el9.x86_64

Complete!

3.1.2 下载并编译安装

创建安装目录:
$ sudo mkdir -p /sqlite/app /sqlite/fgdata /sqlite/logs /sqlite/scripts
$ sudo chown -R $(whoami):$(whoami) /sqlite

下载sqlite源码:
$ cd /backup
$ wget https://www.sqlite.org/2024/sqlite-autoconf-3450200.tar.gz
–2024-04-08 10:05:00– https://www.sqlite.org/2024/sqlite-autoconf-3450200.tar.gz
Resolving www.sqlite.org… 45.33.254.241
Connecting to www.sqlite.org|45.33.254.241|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 3091961 (2.9M) [application/x-gzip]
Saving to: ‘sqlite-autoconf-3450200.tar.gz’

sqlite-autoconf-3450200.tar.gz 100%[===================================================================>] 2.95M 1.02MB/s in 2.9s

2024-04-08 10:05:03 (1.02 MB/s) – ‘sqlite-autoconf-3450200.tar.gz’ saved [3091961/3091961]

解压源码包:
$ tar -xzf sqlite-autoconf-3450200.tar.gz
$ cd sqlite-autoconf-3450200

配置编译选项:
$ ./configure –prefix=/sqlite/app –enable-static –enable-shared \
CFLAGS=”-DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -O2″
checking build system type… x86_64-pc-linux-gnu
checking host system type… x86_64-pc-linux-gnu
checking for gcc… gcc
checking whether the C compiler works… yes
checking for C compiler default output file name… a.out
checking for suffix of executables…
checking whether we are cross compiling… no
checking for suffix of object files… o
checking whether the compiler supports GNU C… yes
checking whether gcc accepts -g… yes

config.status: creating Makefile
config.status: creating sqlite3.pc

编译安装:
$ make -j$(nproc)
gcc -DPACKAGE_NAME=\”sqlite\” -DPACKAGE_TARNAME=\”sqlite\” -DPACKAGE_VERSION=\”3.45.2\” \
-DPACKAGE_STRING=\”sqlite\ 3.45.2\” -DPACKAGE_BUGREPORT=\”\” -DPACKAGE_URL=\”\” \
-DPACKAGE=\”sqlite\” -DVERSION=\”3.45.2\” -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 \
-DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 \
-DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 \
-DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -O2 \
-DSQLITE_THREADSAFE=1 -DSQLITE_HAVE_ZLIB=1 -I. -D_REENTRANT -c sqlite3.c
gcc -g -O2 -o sqlite3 shell.c sqlite3.c -lpthread -ldl -lm -lz -lreadline

$ make install
make[1]: Entering directory ‘/backup/sqlite-autoconf-3450200’
/usr/bin/mkdir -p ‘/sqlite/app/bin’
/usr/bin/install -c sqlite3 ‘/sqlite/app/bin’
/usr/bin/mkdir -p ‘/sqlite/app/include’
/usr/bin/install -c -m 644 sqlite3.h sqlite3ext.h ‘/sqlite/app/include’
/usr/bin/mkdir -p ‘/sqlite/app/lib’
/usr/bin/install -c -m 644 libsqlite3.a libsqlite3.la ‘/sqlite/app/lib’
/usr/bin/mkdir -p ‘/sqlite/app/lib/pkgconfig’
/usr/bin/install -c -m 644 sqlite3.pc ‘/sqlite/app/lib/pkgconfig’
make[1]: Leaving directory ‘/backup/sqlite-autoconf-3450200’

3.1.3 配置环境变量

配置环境变量:
$ echo ‘export PATH=/sqlite/app/bin:$PATH’ >> ~/.bashrc
$ echo ‘export LD_LIBRARY_PATH=/sqlite/app/lib:$LD_LIBRARY_PATH’ >> ~/.bashrc
$ source ~/.bashrc

验证安装:
$ which sqlite3
/sqlite/app/bin/sqlite3

$ sqlite3 –version
sqlite 3.45.2 2024-03-12 11:06:23 d8cd6d49b46a395b13955387d05e9e1a8a87e8ed7996bbd593f5c8b1cde0bd9a

验证编译选项:
$ sqlite3 :memory: “SELECT * FROM pragma_compile_options() LIMIT 10;”
ATOMIC_INTRINSICS=1
BINDATA=1
BUG_COMPATIBLE_20160819=1
CASE_SENSITIVE_LIKE
COMPILER=gcc-11.3.1
DEFAULT_AUTOVACUUM=0
DEFAULT_CACHE_SIZE=-2000
DEFAULT_FILE_FORMAT=4
DEFAULT_JOURNAL_SIZE_LIMIT=-1
DEFAULT_MEMSTATUS=1

3.2 sqlite数据库命令行使用实战

sqlite3命令行工具提供了丰富的功能,以下是常用的操作实战。更多学习教程公众号风哥教程itpux_com

3.2.1 数据库基本操作

创建数据库:
$ sqlite3 /sqlite/fgdata/fgedudb.db
SQLite version 3.45.2 2024-03-12 11:06:23
Enter “.help” for usage hints.
sqlite>

查看数据库信息:
sqlite> .databases
main: /sqlite/fgdata/fgedudb.db r/w

查看当前设置:
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: “”
output: stdout
separator: “|”
width:

设置输出格式:
sqlite> .headers on
sqlite> .mode column
sqlite> .width 10 20 15 20

查看版本信息:
sqlite> SELECT sqlite_version();
sqlite_version()
—————-
3.45.2

查看帮助信息:
sqlite> .help
.archive … Manage SQL archives
.auth ON|OFF Show authorizer callbacks
.backup ?DB? FILE Backup DB (default “main”) to FILE
.bail on|off Stop after hitting an error. Default OFF
.binary on|off Turn binary output on or off. Default OFF
.cd DIRECTORY Change the working directory to DIRECTORY
.changes on|off Show number of rows changed by SQL
.check GLOB Fail if output since .testcase does not match
.clone NEWDB Clone data into NEWDB from the existing database
.connection [close] [#] Open or close an auxiliary database connection

3.2.2 表操作命令

创建测试表:
sqlite> CREATE TABLE fgedu_users (
…> id INTEGER PRIMARY KEY AUTOINCREMENT,
…> username TEXT NOT NULL UNIQUE,
…> email TEXT,
…> phone TEXT,
…> status INTEGER DEFAULT 1,
…> created_at DATETIME DEFAULT CURRENT_TIMESTAMP
…> );

sqlite> CREATE TABLE fgedu_orders (
…> id INTEGER PRIMARY KEY AUTOINCREMENT,
…> user_id INTEGER NOT NULL,
…> product_name TEXT NOT NULL,
…> quantity INTEGER DEFAULT 1,
…> amount REAL,
…> order_date DATE DEFAULT (date(‘now’)),
…> FOREIGN KEY (user_id) REFERENCES fgedu_users(id)
…> );

查看所有表:
sqlite> .tables
fgedu_orders fgedu_users

查看表结构:
sqlite> .schema fgedu_users
CREATE TABLE fgedu_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT,
phone TEXT,
status INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

查看表完整信息:
sqlite> .schema
CREATE TABLE fgedu_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT,
phone TEXT,
status INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE fgedu_orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_name TEXT NOT NULL,
quantity INTEGER DEFAULT 1,
amount REAL,
order_date DATE DEFAULT (date(‘now’)),
FOREIGN KEY (user_id) REFERENCES fgedu_users(id)
);

查看索引:
sqlite> .indices fgedu_users
(无索引,主键自动创建索引)

3.2.3 数据导入导出

导出数据库为SQL脚本:
sqlite> .output /sqlite/backup/fgedudb_backup.sql
sqlite> .dump
sqlite> .output stdout

导出单个表:
sqlite> .output /sqlite/backup/fgedu_users_backup.sql
sqlite> .dump fgedu_users
sqlite> .output stdout

导入SQL脚本:
sqlite> .read /sqlite/backup/fgedudb_backup.sql

CSV格式导出:
sqlite> .headers on
sqlite> .mode csv
sqlite> .output /sqlite/backup/fgedu_users.csv
sqlite> SELECT * FROM fgedu_users;
sqlite> .output stdout

CSV格式导入:
sqlite> .mode csv
sqlite> .import /sqlite/data/users.csv fgedu_users

查看导出的CSV文件:
$ cat /sqlite/backup/fgedu_users.csv
id,username,email,phone,status,created_at
1,fgedu01,fgedu01@fgedu.net.cn,13800138001,1,2024-04-08 10:10:00
2,fgedu02,fgedu02@fgedu.net.cn,13800138002,1,2024-04-08 10:10:01

3.3 sqlite数据库CRUD操作实战

以下是sqlite数据库CRUD操作的详细实战示例。风哥提示:CRUD操作是数据库使用的基础,务必熟练掌握。

3.3.1 Create操作实战

插入单条数据:
sqlite> INSERT INTO fgedu_users (username, email, phone)
…> VALUES (‘fgedu01’, ‘fgedu01@fgedu.net.cn’, ‘13800138001’);

sqlite> INSERT INTO fgedu_users (username, email, phone)
…> VALUES (‘fgedu02’, ‘fgedu02@fgedu.net.cn’, ‘13800138002’);

sqlite> INSERT INTO fgedu_users (username, email, phone)
…> VALUES (‘fgedu03’, ‘fgedu03@fgedu.net.cn’, ‘13800138003’);

查看插入结果:
sqlite> SELECT * FROM fgedu_users;
id username email phone status created_at
— ——– ——————– ———– —— ——————-
1 fgedu01 fgedu01@fgedu.net.cn 13800138001 1 2024-04-08 10:10:00
2 fgedu02 fgedu02@fgedu.net.cn 13800138002 1 2024-04-08 10:10:01
3 fgedu03 fgedu03@fgedu.net.cn 13800138003 1 2024-04-08 10:10:02

批量插入数据:
sqlite> INSERT INTO fgedu_orders (user_id, product_name, quantity, amount)
…> SELECT id, ‘产品A’, 2, 199.99 FROM fgedu_users WHERE username = ‘fgedu01’;

sqlite> INSERT INTO fgedu_orders (user_id, product_name, quantity, amount)
…> SELECT id, ‘产品B’, 1, 299.00 FROM fgedu_users WHERE username = ‘fgedu02’;

sqlite> INSERT INTO fgedu_orders (user_id, product_name, quantity, amount)
…> SELECT id, ‘产品C’, 3, 99.00 FROM fgedu_users WHERE username = ‘fgedu03’;

查看订单数据:
sqlite> SELECT * FROM fgedu_orders;
id user_id product_name quantity amount order_date
— ——- ———— ——– ——- ———-
1 1 产品A 2 199.99 2024-04-08
2 2 产品B 1 299.00 2024-04-08
3 3 产品C 3 99.00 2024-04-08

使用事务批量插入:
sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO fgedu_users (username, email) VALUES (‘fgedu04’, ‘fgedu04@fgedu.net.cn’);
sqlite> INSERT INTO fgedu_users (username, email) VALUES (‘fgedu05’, ‘fgedu.net.cn’);
sqlite> INSERT INTO fgedu_users (username, email) VALUES (‘fgedu06’, ‘fgedu06@fgedu.net.cn’);
sqlite> COMMIT;

验证插入结果:
sqlite> SELECT COUNT(*) as total_users FROM fgedu_users;
total_users
———–
6

3.3.2 Read操作实战

查询所有数据:
sqlite> SELECT * FROM fgedu_users;
id username email phone status created_at
— ——– ——————– ———– —— ——————-
1 fgedu01 fgedu01@fgedu.net.cn 13800138001 1 2024-04-08 10:10:00
2 fgedu02 fgedu02@fgedu.net.cn 13800138002 1 2024-04-08 10:10:01
3 fgedu03 fgedu03@fgedu.net.cn 13800138003 1 2024-04-08 10:10:02
4 fgedu04 fgedu04@fgedu.net.cn 1 2024-04-08 10:15:00
5 fgedu05 fgedu.net.cn 1 2024-04-08 10:15:01
6 fgedu06 fgedu06@fgedu.net.cn 1 2024-04-08 10:15:02

条件查询:
sqlite> SELECT * FROM fgedu_users WHERE status = 1;
(返回所有status=1的用户)

sqlite> SELECT * FROM fgedu_users WHERE username LIKE ‘fgedu%’;
(返回用户名以fgedu开头的用户)

sqlite> SELECT * FROM fgedu_users WHERE id IN (1, 2, 3);
id username email phone status created_at
— ——– ——————– ———– —— ——————-
1 fgedu01 fgedu01@fgedu.net.cn 13800138001 1 2024-04-08 10:10:00
2 fgedu02 fgedu02@fgedu.net.cn 13800138002 1 2024-04-08 10:10:01
3 fgedu03 fgedu03@fgedu.net.cn 13800138003 1 2024-04-08 10:10:02

排序查询:
sqlite> SELECT * FROM fgedu_users ORDER BY created_at DESC LIMIT 3;
id username email phone status created_at
— ——– ——————– —– —— ——————-
6 fgedu06 fgedu06@fgedu.net.cn 1 2024-04-08 10:15:02
5 fgedu05 fgedu.net.cn 1 2024-04-08 10:15:01
4 fgedu04 fgedu04@fgedu.net.cn 1 2024-04-08 10:15:00

聚合查询:
sqlite> SELECT status, COUNT(*) as count FROM fgedu_users GROUP BY status;
status count
—— —–
1 6

sqlite> SELECT COUNT(*) as total,
…> COUNT(email) as has_email,
…> COUNT(phone) as has_phone
…> FROM fgedu_users;
total has_email has_phone
—– ——— ———
6 6 3

关联查询:
sqlite> SELECT u.username, o.product_name, o.quantity, o.amount
…> FROM fgedu_users u
…> JOIN fgedu_orders o ON u.id = o.user_id;
username product_name quantity amount
——– ———— ——– ——
fgedu01 产品A 2 199.99
fgedu02 产品B 1 299.00
fgedu03 产品C 3 99.00

3.3.3 Update操作实战

更新单条数据:
sqlite> UPDATE fgedu_users
…> SET phone = ‘13900139001’
…> WHERE username = ‘fgedu04’;

sqlite> SELECT username, phone FROM fgedu_users WHERE username = ‘fgedu04’;
username phone
——– ———–
fgedu04 13900139001

更新多条数据:
sqlite> UPDATE fgedu_users
…> SET status = 0
…> WHERE phone IS NULL;

sqlite> SELECT username, phone, status FROM fgedu_users;
username phone status
——– ———– ——
fgedu01 13800138001 1
fgedu02 13800138002 1
fgedu03 13800138003 1
fgedu04 13900139001 1
fgedu05 0
fgedu06 0

使用表达式更新:
sqlite> UPDATE fgedu_orders
…> SET amount = quantity * amount
…> WHERE id = 1;

sqlite> SELECT * FROM fgedu_orders WHERE id = 1;
id user_id product_name quantity amount order_date
— ——- ———— ——– ——- ———-
1 1 产品A 2 399.98 2024-04-08

更新时间戳:
sqlite> UPDATE fgedu_users
…> SET created_at = datetime(‘now’)
…> WHERE id = 1;

sqlite> SELECT id, username, created_at FROM fgedu_users WHERE id = 1;
id username created_at
— ——– ——————-
1 fgedu01 2024-04-08 10:20:00

3.3.4 Delete操作实战

删除单条数据:
sqlite> DELETE FROM fgedu_users WHERE username = ‘fgedu05’;

sqlite> SELECT COUNT(*) FROM fgedu_users;
COUNT(*)
——–
5

删除多条数据:
sqlite> DELETE FROM fgedu_users WHERE status = 0;

sqlite> SELECT COUNT(*) FROM fgedu_users;
COUNT(*)
——–
4

条件删除:
sqlite> DELETE FROM fgedu_orders WHERE amount < 100;

sqlite> SELECT * FROM fgedu_orders;
id user_id product_name quantity amount order_date
— ——- ———— ——– ——- ———-
1 1 产品A 2 399.98 2024-04-08
2 2 产品B 1 299.00 2024-04-08

清空表数据(保留表结构):
sqlite> DELETE FROM fgedu_orders;

sqlite> SELECT COUNT(*) FROM fgedu_orders;
COUNT(*)
——–
0

sqlite> .schema fgedu_orders
CREATE TABLE fgedu_orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_name TEXT NOT NULL,
quantity INTEGER DEFAULT 1,
amount REAL,
order_date DATE DEFAULT (date(‘now’)),
FOREIGN KEY (user_id) REFERENCES fgedu_users(id)
);

Part04-生产案例与实战讲解

4.1 sqlite数据库多平台安装案例

以下是在不同操作系统上安装sqlite数据库的案例。更多视频教程www.fgedu.net.cn

4.1.1 Ubuntu系统安装案例

Ubuntu系统包管理器安装:
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Fetched 228 kB in 2s (114 kB/s)
Reading package lists… Done

$ sudo apt install -y sqlite3 libsqlite3-dev
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
The following additional packages will be installed:
libsqlite3-0
Suggested packages:
sqlite3-doc
The following NEW packages will be installed:
libsqlite3-dev sqlite3
The following packages will be upgraded:
libsqlite3-0
1 upgraded, 2 newly installed, 0 to remove and 45 not upgraded.
Need to get 1,234 kB of archives.
After this operation, 2,456 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libsqlite3-0 amd64 3.37.2-2ubuntu0.3 [641 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libsqlite3-dev amd64 3.37.2-2ubuntu0.3 [593 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 sqlite3 amd64 3.37.2-2ubuntu0.3 [768 kB]
Fetched 1,234 kB in 3s (412 kB/s)
(Reading database … 123456 files and directories currently installed.)
Preparing to unpack …/libsqlite3-0_3.37.2-2ubuntu0.3_amd64.deb …
Unpacking libsqlite3-0:amd64 (3.37.2-2ubuntu0.3) over (3.37.2-2) …
Preparing to unpack …/libsqlite3-dev_3.37.2-2ubuntu0.3_amd64.deb …
Unpacking libsqlite3-dev:amd64 (3.37.2-2ubuntu0.3) …
Preparing to unpack …/sqlite3_3.37.2-2ubuntu0.3_amd64.deb …
Unpacking sqlite3:amd64 (3.37.2-2ubuntu0.3) …
Setting up libsqlite3-0:amd64 (3.37.2-2ubuntu0.3) …
Setting up libsqlite3-dev:amd64 (3.37.2-2ubuntu0.3) …
Setting up sqlite3:amd64 (3.37.2-2ubuntu0.3) …
Processing triggers for man-db (2.10.2-1) …
Processing triggers for libc-bin (2.35-0ubuntu3.6) …

验证安装:
$ sqlite3 –version
sqlite 3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3aed8

4.1.2 macOS系统安装案例

macOS系统Homebrew安装:
$ brew install sqlite
==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/manifests/3.45.2
==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/blobs/sha256:abc123…
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:abc123…
######################################################################## 100.0%
==> Pouring sqlite–3.45.2.arm64_sonoma.bottle.tar.gz
==> Caveats
sqlite is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have sqlite first in your PATH, run:
echo ‘export PATH=”/opt/homebrew/opt/sqlite/bin:$PATH”‘ >> ~/.zshrc

For compilers to find sqlite you may need to set:
export LDFLAGS=”-L/opt/homebrew/opt/sqlite/lib”
export CPPFLAGS=”-I/opt/homebrew/opt/sqlite/include”

For pkg-config to find sqlite you may need to set:
export PKG_CONFIG_PATH=”/opt/homebrew/opt/sqlite/lib/pkgconfig”

==> Summary
🍺 /opt/homebrew/Cellar/sqlite/3.45.2: 12 files, 4.5MB
==> Running `brew cleanup sqlite`…
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

验证安装:
$ /opt/homebrew/opt/sqlite/bin/sqlite3 –version
sqlite 3.45.2 2024-03-12 11:06:23 d8cd6d49b46a395b13955387d05e9e1a8a87e8ed7996bbd593f5c8b1cde0bd9a

4.2 sqlite数据库命令行高级应用案例

以下是sqlite3命令行工具的高级应用案例。学习交流加群风哥微信: itpux-com

4.2.1 执行计划分析案例

创建测试数据:
sqlite> CREATE TABLE fgedu_products (
…> id INTEGER PRIMARY KEY,
…> name TEXT NOT NULL,
…> category TEXT,
…> price REAL,
…> stock INTEGER
…> );

sqlite> INSERT INTO fgedu_products VALUES
…> (1, ‘产品A’, ‘电子’, 199.99, 100),
…> (2, ‘产品B’, ‘服装’, 299.00, 50),
…> (3, ‘产品C’, ‘电子’, 99.00, 200);

查看执行计划:
sqlite> EXPLAIN QUERY PLAN SELECT * FROM fgedu_products WHERE id = 1;
QUERY PLAN
`–SEARCH fgedu_products USING INTEGER PRIMARY KEY (rowid=?)

sqlite> EXPLAIN QUERY PLAN SELECT * FROM fgedu_products WHERE category = ‘电子’;
QUERY PLAN
`–SCAN fgedu_products

创建索引后查看执行计划:
sqlite> CREATE INDEX idx_category ON fgedu_products(category);

sqlite> EXPLAIN QUERY PLAN SELECT * FROM fgedu_products WHERE category = ‘电子’;
QUERY PLAN
`–SEARCH fgedu_products USING INDEX idx_category (category=?)

4.2.2 数据库维护案例

数据库完整性检查:
sqlite> PRAGMA integrity_check;
integrity_check
—————
ok

数据库优化:
sqlite> VACUUM;

更新统计信息:
sqlite> ANALYZE;

查看数据库信息:
sqlite> PRAGMA database_list;
seq name file
— —- —————————-
0 main /sqlite/fgdata/fgedudb.db

查看表信息:
sqlite> PRAGMA table_info(fgedu_users);
cid name type notnull dflt_value pk
— ———- ——- ——- ———- —
0 id INTEGER 0 1
1 username TEXT 1 0
2 email TEXT 0 0
3 phone TEXT 0 0
4 status INTEGER 0 1 0
5 created_at DATETIME 0 CURRENT_TI 0

查看数据库大小:
sqlite> SELECT name,
…> (pgsize * pgcount) / 1024 / 1024 as size_mb
…> FROM dbstat
…> GROUP BY name;
name size_mb
————- ——-
fgedu_orders 0.00
fgedu_products 0.00
fgedu_users 0.00

4.3 sqlite数据库CRUD批量操作案例

以下是批量CRUD操作的实际案例。风哥提示:批量操作时务必使用事务,可以大幅提升性能。

4.3.1 批量插入案例

创建批量插入脚本:
$ cat > /sqlite/scripts/batch_insert.sh << 'EOF' #!/bin/bash # batch_insert.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn DB_PATH="/sqlite/fgdata/fgedudb.db" BATCH_SIZE=1000 echo "开始批量插入数据..." sqlite3 $DB_PATH << SQL BEGIN TRANSACTION; WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x+1 FROM cnt WHERE x < $BATCH_SIZE ) SELECT printf('INSERT INTO fgedu_users (username, email, phone) VALUES (''user%04d'', ''user%04d@fgedu.net.cn'', ''138%08d'');', x, x, x) FROM cnt; COMMIT; SELECT COUNT(*) as total_users FROM fgedu_users; SQL echo "批量插入完成" EOF $ chmod +x /sqlite/scripts/batch_insert.sh 执行批量插入: $ /sqlite/scripts/batch_insert.sh 开始批量插入数据... total_users ----------- 1004 批量插入完成

4.3.2 批量更新案例

批量更新数据:
sqlite> BEGIN TRANSACTION;

sqlite> UPDATE fgedu_users
…> SET status = CASE
…> WHEN id % 2 = 0 THEN 1
…> ELSE 0
…> END;

sqlite> COMMIT;

验证更新结果:
sqlite> SELECT status, COUNT(*) as count
…> FROM fgedu_users
…> GROUP BY status;
status count
—— —–
0 502
1 502

批量更新使用子查询:
sqlite> UPDATE fgedu_users
…> SET email = username || ‘@fgedu.net.cn’
…> WHERE email IS NULL OR email = ”;

sqlite> SELECT COUNT(*) as updated
…> FROM fgedu_users
…> WHERE email LIKE ‘%@fgedu.net.cn’;
updated
——-
1004

Part05-风哥经验总结与分享

5.1 sqlite数据库安装最佳实践

基于多年的实践经验,以下是sqlite数据库安装的最佳实践总结。更多学习教程公众号风哥教程itpux_com

5.1.1 安装方式选择建议

sqlite数据库安装方式选择建议:

开发环境:
├── 包管理器安装(快速便捷)
├── 无需特殊编译选项
└── 版本可能不是最新

测试环境:
├── 包管理器或预编译包
├── 版本与生产环境一致
└── 便于快速部署

生产环境:
├── 源码编译安装(推荐)
├── 自定义编译选项
├── 启用必要扩展
└── 优化性能参数

编译选项建议:
-DSQLITE_ENABLE_FTS5 # 全文检索
-DSQLITE_ENABLE_JSON1 # JSON支持
-DSQLITE_ENABLE_RTREE # R树索引
-DSQLITE_THREADSAFE=1 # 线程安全
-DSQLITE_DEFAULT_CACHE_SIZE=-64000 # 默认缓存64MB

5.2 sqlite数据库命令行使用技巧

以下是sqlite3命令行工具的使用技巧总结。学习交流加群风哥QQ113257174

5.2.1 命令行技巧汇总

sqlite3命令行使用技巧:

1. 配置文件技巧
– 创建~/.sqliterc配置文件
– 设置常用输出格式
– 配置默认PRAGMA

2. 输出格式技巧
.mode column # 列模式(易读)
.mode csv # CSV格式(导入导出)
.mode line # 行模式(单条记录)
.mode list # 列表模式(默认)

3. 执行脚本技巧
sqlite3 db.db < script.sql # 重定向执行 sqlite3 db.db ".read script.sql" # 内部命令 sqlite3 db.db "SELECT ..." # 直接执行SQL 4. 调试技巧 .echo on # 显示执行的命令 .timer on # 显示执行时间 .eqp on # 显示执行计划 EXPLAIN QUERY PLAN SELECT ... # 分析查询 5. 备份恢复技巧 .backup backup.db # 在线备份 .dump > backup.sql # SQL导出
.read backup.sql # SQL导入

5.3 sqlite数据库CRUD操作规范

以下是CRUD操作的最佳实践规范。from sqlite视频:www.itpux.com

5.3.1 CRUD操作规范总结

sqlite数据库CRUD操作规范:

INSERT规范:
├── 批量插入使用事务
├── 使用预编译语句
├── 避免单条循环插入
└── 合理使用INSERT OR REPLACE

SELECT规范:
├── 避免SELECT *
├── 使用索引优化查询
├── 合理使用LIMIT
└── 复杂查询使用EXPLAIN分析

UPDATE规范:
├── 必须使用WHERE条件
├── 批量更新使用事务
├── 避免全表更新
└── 更新前备份数据

DELETE规范:
├── 必须使用WHERE条件
├── 批量删除使用事务
├── 考虑使用软删除
└── 删除后执行VACUUM

事务规范:
├── 写操作使用事务
├── 事务保持简短
├── 避免长事务
└── 合理设置隔离级别

风哥总结:sqlite数据库安装简单,但生产环境需要合理规划。命令行工具功能强大,熟练掌握可以大幅提升工作效率。CRUD操作是数据库使用的基础,务必遵循规范,确保数据安全和操作效率。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息