SQLite数据库

相关链接:

SQLite官网:https://www.sqlite.org/

SQLite安装:https://sqlite.org/download.html

SQLite使用:https://sqlite.org/quickstart.html

SQLite语法:http://www.it028.com/sqlite-tutorial.html

SQLite源码:https://github.com/sqlite/sqlite

一、SQLite简介

1、简介

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的嵌入式关系型数据库,它提供了功能齐全的数据库解决方案。SQLite 几乎在所有的手机和计算机上运行,它被嵌入到人们每天都在使用的众多应用程序中。 这也是世界上装机量最大的数据库SQLite,根据SQLite的官方统计,目前正在使用的SQLite数据库实例已经超过了1万亿个

此外,SQLite 还具有稳定的文件格式、跨平台能力和向后兼容性等特点。SQLite 的开发者承诺,至少在 2050 年之前保持该文件格式不变。

SQLite 可以在不需要的服务器的情况下,直接嵌入到一些物联网设备, 比如家电,路由器。汽车等作为本地数据库使用。智能手机也正好契合 SQLite 的使用场景。为什么说手机上肯定有 SQLite 呢?因为 SQLite 会随着应用程序代码一起打包,每安装一个APP都有可能部署一个SQLite的数据库。

当然了,SQLite 不能直接与诸如 MySQL、Oracle、PostgreSQL 或 SQL Server 之类的客户端/服务器 SQL 数据库引擎相比较,因为 SQLite 试图解决的是一个完全不同的场景问题。

  • 客户端/服务器 SQL 数据库引擎努力实现企业数据的共享存储库。它们强调可扩展性、并发性、集中化和控制。
  • 客户端 SQL 数据库——SQLite 努力为单个应用程序和设备提供本地数据存储。它强调经济性、效率、可靠性、独立性和简洁性。

2、SQLite特性

关于SQLite:https://sqlite.org/about.html

不要被名字中的“Lite”所误导。SQLite 拥有功能齐全的 SQL 实现,包括:

  • 数量不限的表、索引、触发器和视图
  • 一张表中最多 32K 列,行数不限
  • 多列索引
  • 索引可以使用 DESC 和 COLLATE
  • 部分索引
  • 表达式上的索引
  • 聚簇索引
  • 覆盖索引
  • CHECK、UNIQUE、NOT NULL 和 FOREIGN KEY 约束。
  • 使用 BEGIN、COMMIT 和 ROLLBACK 的 ACID 事务
  • 使用 SAVEPOINT、RELEASE 和 ROLLBACK TO 的嵌套事务
  • 子查询,包括相关子查询
  • LEFT、RIGHT 和 FULL OUTER JOIN
  • DISTINCT、ORDER BY、GROUP BY、HAVING、LIMIT 和 OFFSET
  • UNION、UNION ALL、INTERSECT 和 EXCEPT
  • 丰富的标准 SQL 函数库
  • 包括 DISTINCT 聚合的聚合函数
  • UPDATE、DELETE 和 INSERT
  • 包括递归公共表表达式的公共表表达式
  • 全文搜索
  • R 树索引
  • JSON 支持
  • REPLACE INTO
  • REINDEX
  • GLOB 操作符
  • ON CONFLICT 子句
  • INDEXED BY 子句
  • 虚拟表
  • 使用 ATTACH DATABASE 在同一个数据库连接上的多个数据库

3、适用场景

物联网数据库:SQLite 非常适合用于嵌入式设备:手机、机顶盒、电视、游戏机、相机、手表、厨房电器、恒温器、汽车、机床、飞机、远程传感器、无人机、医疗设备和机器人等,即“物联网”。SQLite 代码占用空间小,能高效利用内存、磁盘空间和磁盘带宽,可靠性高,并且不需要数据库管理员进行维护。

应用文件格式:SQLite 数据库支持将 XML、JSON、CSV 或某些专有的格式写入到应用程序所使用的磁盘文件中,并且不需要编写和调试解析器,这样数据也更容易实现跨平台的访问,并且SQLite 数据库支持事务。
SQLite 经常被用作桌面应用程序(如版本控制系统、财务分析工具、媒体编目和编辑套件、CAD 软件包、记录保存程序等)的磁盘文件格式。传统的“文件/打开”操作会调用 sqlite3_open() 来连接到数据库文件。这种方法有许多好处,包括提高性能、降低成本和复杂性以及提高可靠性。

网站数据库:SQLite 不需要配置或调优,并且可以将信息存储在普通的磁盘文件中,这也使其成为中小型网站数据库的热门选择。SQLite 作为大多数中低流量网站(每天点击量在10W次甚至100W次)的数据库引擎效果很好。

企业关系型数据库管理系统的替代品:SQLite 经常被用作企业关系型数据库管理系统的替代品,用于演示或测试。SQLite 速度快且无需设置,这大大减少了测试的麻烦,使演示更加活泼且易于启动。

数据分析:懂 SQL 的人可以使用 sqlite3 命令行外壳(或各种第三方 SQLite 访问程序)来分析大型数据集。原始数据可以从 CSV 文件导入,然后对这些数据进行切片和切块以生成无数的汇总报告。更复杂的分析可以使用 Python(内置了 SQLite)编写的简单脚本,或者使用 R 或其他语言的现成适配器来完成。可能的用途包括网站日志分析、体育统计分析、编程指标的编译和实验结果的分析。许多生物信息学研究人员以这种方式使用 SQLite。

当然,使用企业客户端/服务器数据库也可以完成同样的事情。SQLite 的优点是更易于安装和使用,并且生成的数据库是一个可以写入 USB 记忆棒或通过电子邮件发送给同事的单个文件。

企业数据缓存:许多应用程序使用 SQLite 作为企业 RDBMS 相关内容的缓存。这减少了延迟,因为现在大多数查询都针对本地缓存进行,避免了网络往返。它还减少了网络和中央数据库服务器的负载。在许多情况下,这意味着客户端应用程序在网络中断期间仍能继续运行。

替代临时磁盘文件:许多程序使用 fopen()fread()fwrite() 以自制格式创建和管理数据文件。SQLite 作为这些临时数据文件的替代品效果特别好。与直觉相反,SQLite 在读写磁盘内容方面可能比文件系统更快。

内部或临时数据库:对于有大量数据需要以各种方式筛选和排序的程序,通常将数据加载到内存中的 SQLite 数据库中,并使用带有连接和 ORDER BY 子句的查询以所需的形式和顺序提取数据,比尝试手动编码相同的操作更容易和更快。以这种方式在内部使用 SQL 数据库还为程序提供了更大的灵活性,因为可以添加新的列和索引而无需重新编码每个查询。

教育和培训:由于设置和使用简单(安装很简单:只需将 sqlite3sqlite3.exe 可执行文件复制到目标机器并运行它),SQLite 是用于教授 SQL 的良好数据库引擎。学生可以轻松创建任意数量的数据库,并可以通过电子邮件将数据库发送给教师进行评论或评分。对于有兴趣研究 RDBMS 如何实现的更高级学生,模块化且注释良好、文档齐全的 SQLite 代码可以作为一个良好的基础。

4、不适用场景

客户端/服务器应用程序:如果有许多客户端程序通过网络向同一个数据库发送 SQL,那么应使用客户端/服务器数据库引擎而不是 SQLite。SQLite 可以在网络文件系统上运行,但由于大多数网络文件系统存在延迟,性能不会太好。此外,许多网络文件系统实现(在 Unix 和 Windows 上)中的文件锁定逻辑都存在错误。如果文件锁定不能正常工作,两个或更多的客户端可能会尝试同时修改同一个数据库的同一部分,从而导致损坏。由于这个问题源于底层文件系统实现中的错误,SQLite 对此无能为力。

一个好的经验法则是,在同一数据库将被直接访问(没有中间应用服务器)并且同时通过网络从多台计算机访问的情况下,避免使用 SQLite。

高流量网站:SQLite 通常作为网站的数据库后端运行良好。但如果网站写入密集或非常繁忙以至于需要多个服务器,那么应考虑使用企业级的客户端/服务器数据库引擎而不是 SQLite。

非常大的数据集:SQLite 数据库的大小限制为 281 太字节(2^48 字节,256 太字节)。即使它能够处理更大的数据库,SQLite 也将整个数据库存储在一个磁盘文件中,而许多文件系统将文件的最大大小限制在小于此的值。因此,如果您正在考虑如此规模的数据库,最好考虑使用将其内容分布在多个磁盘文件中,甚至可能分布在多个卷中的客户端/服务器数据库引擎。

高并发:SQLite 支持无限数量的同时读取者,但在任何时刻都只允许一个写入者。对于许多情况,这不是问题。写入者会排队。每个应用程序快速完成其数据库工作并继续,并且任何锁定都不会持续超过几十毫秒。但有些应用程序需要更高的并发,这些应用程序可能需要寻求其他解决方案。

5、如何选择

数据是否通过网络与应用程序分离? → 选择客户端/服务器

关系型数据库引擎充当降低带宽的数据过滤器。因此,最好将数据库引擎和数据放在同一物理设备上,这样高带宽的引擎到磁盘的链接就不必穿越网络,只有低带宽的应用程序到引擎的链接需要穿越网络。

但 SQLite 是内置于应用程序中的。因此,如果数据与应用程序在不同的设备上,就需要高带宽的引擎到磁盘的链接通过网络。这可行,但并非最优。因此,当数据与应用程序在不同的设备上时,通常最好选择客户端/服务器数据库引擎。

注意:在这条规则中,“应用程序”是指发出 SQL 语句的代码。如果“应用程序”是一个应用服务器,并且内容与应用服务器位于同一物理机器上,那么即使最终用户在另一个网络跳点之外,SQLite 可能仍然适用。

有许多并发写入者吗? → 选择客户端/服务器

如果许多线程和/或进程需要在同一时刻写入数据库(并且它们不能排队轮流),那么最好选择支持该功能的数据库引擎,这通常意味着选择客户端/服务器数据库引擎。

SQLite 每个数据库文件在同一时间只支持一个写入者。但在大多数情况下,一个写事务只需要几毫秒,因此多个写入者可以简单地轮流进行。SQLite 处理的写并发比许多人想象的要多。然而,客户端/服务器数据库系统,由于它们有一个长期运行的服务器进程来协调访问,通常能够处理比 SQLite 多得多的写并发。

大数据? → 选择客户端/服务器

如果您的数据将增长到您无法或不愿意放入单个磁盘文件的大小,那么您应该选择除 SQLite 之外的解决方案。SQLite 支持最大 281 太字节大小的数据库,假设您能找到支持 281 太字节文件的磁盘驱动器和文件系统。即便如此,当内容的大小看起来可能会逐渐进入太字节范围时,最好考虑使用集中式的客户端/服务器数据库。

否则 → 选择 SQLite!

对于具有低写入者并发和少于太字节内容的设备本地存储,SQLite 几乎总是一个更好的解决方案。SQLite 快速、可靠,并且不需要配置或维护。它使事情变得简单。SQLite“就是能行”。

二、SQLite安装

1、下载

在 SQLite 官方页面下载适合操作系统的压缩包。

下载并解压,并配置环境变量后,无论是在 Windows、Linux 还是 Mac OS 系统上,都可以得到一个 sqlite3 命令行工具。

2、安装

  • 以Linux系统安装为例
# 创建sqlite目录,并上传文件到sqlite目录下
[root@k8s-dev ~]# mkdir sqlite
[root@k8s-dev ~]# cd sqlite/
[root@k8s-dev sqlite]# ll
total 10792
-rw-r--r-- 1 root root 11048231 Aug 15 14:44 sqlite-tools-linux-x64-3460100.zip
[root@k8s-dev sqlite]# unzip sqlite-tools-linux-x64-3460100.zip 
Archive:  sqlite-tools-linux-x64-3460100.zip
  inflating: sqlite3                 
  inflating: sqldiff                 
  inflating: sqlite3_analyzer        
[root@k8s-dev sqlite]# ll
total 33368
-rwxrwxr-x 1 root root  6946064 Aug 13 19:05 sqldiff
-rwxrwxr-x 1 root root  8710792 Aug 13 19:04 sqlite3
-rwxrwxr-x 1 root root  7454784 Aug 13 19:05 sqlite3_analyzer
-rw-r--r-- 1 root root 11048231 Aug 15 14:44 sqlite-tools-linux-x64-3460100.zip
# 当前未配置环境变量
[root@k8s-dev sqlite]# ./sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
  • 配置环境变量
vim /etc/profile

## 在profile文件最后一行添加上如下内容
## sqlite安装路径
export PATH=$PATH:/root/sqlite

# 让环境变量生效
source /etc/profile

# 再次执行打开一个sqlite数据库
[root@k8s-dev sqlite]# sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 

三、SQLite基本语法

SQLite语法:http://www.it028.com/sqlite-tutorial.html

SQLite支持SQL语法,如果你会MySQL,那么SQLite语法的学习也就变得轻而易举。

1、数据库操作

①、新建数据库

可以直接执行 sqlite3 filename 打开或创建一个 SQLite 数据库。如果文件不存在,SQLite 会自动创建它。

# 再次执行打开一个sqlite数据库
[root@k8s-dev sqlite]# sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 

也可以首先创建一个空白文件,然后使用 sqlite3 命令打开它。

②、查看数据库
sqlite> .database
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /root/sqlite/test.db

使用 .exit 退出 sqlite3 工具。 再查看当前目录,会发现新增了一个 test.db 文件。

sqlite> .exit
[root@k8s-dev sqlite]# ll
total 33372
-rwxrwxr-x 1 root root  6946064 Aug 13 19:05 sqldiff
-rwxrwxr-x 1 root root  8710792 Aug 13 19:04 sqlite3
-rwxrwxr-x 1 root root  7454784 Aug 13 19:05 sqlite3_analyzer
-rw-r--r-- 1 root root 11048231 Aug 15 14:44 sqlite-tools-linux-x64-3460100.zip
-rw-r--r-- 1 root root     2048 Aug 15 14:46 test.db
③、查看帮助指令

使用 .help 查看 帮助信息。【重要】

sqlite> .help
.backup ?DB? FILE      Backup DB (default "main") to FILE
.bail ON|OFF           Stop after hitting an error.  Default OFF
.databases             List names and files of attached databases
.dump ?TABLE? ...      Dump the database in an SQL text format
                         If TABLE specified, only dump tables matching
                         LIKE pattern TABLE.
.echo ON|OFF           Turn command echo on or off
.exit                  Exit this program
.explain ?ON|OFF?      Turn output mode suitable for EXPLAIN on or off.
                         With no args, it turns EXPLAIN on.
.header(s) ON|OFF      Turn display of headers on or off
.help                  Show this message
.import FILE TABLE     Import data from FILE into TABLE
.indices ?TABLE?       Show names of all indices
                         If TABLE specified, only show indices for tables
                         matching LIKE pattern TABLE.
.load FILE ?ENTRY?     Load an extension library
.log FILE|off          Turn logging on or off.  FILE can be stderr/stdout
.mode MODE ?TABLE?     Set output mode where MODE is one of:
                         csv      Comma-separated values
                         column   Left-aligned columns.  (See .width)
                         html     HTML <table> code
                         insert   SQL insert statements for TABLE
                         line     One value per line
                         list     Values delimited by .separator string
                         tabs     Tab-separated values
                         tcl      TCL list elements
.nullvalue STRING      Use STRING in place of NULL values
.output FILENAME       Send output to FILENAME
.output stdout         Send output to the screen
.print STRING...       Print literal STRING
.prompt MAIN CONTINUE  Replace the standard prompts
.quit                  Exit this program
.read FILENAME         Execute SQL in FILENAME
.restore ?DB? FILE     Restore content of DB (default "main") from FILE
.schema ?TABLE?        Show the CREATE statements
                         If TABLE specified, only show tables matching
                         LIKE pattern TABLE.
.separator STRING      Change separator used by output mode and .import
.show                  Show the current values for various settings
.stats ON|OFF          Turn stats on or off
.tables ?TABLE?        List names of tables
                         If TABLE specified, only list tables matching
                         LIKE pattern TABLE.
.timeout MS            Try opening locked tables for MS milliseconds
.trace FILE|off        Output each SQL statement as it is run
.vfsname ?AUX?         Print the name of the VFS stack
.width NUM1 NUM2 ...   Set column widths for "column" mode
.timer ON|OFF          Turn the CPU timer measurement on or off

2、表操作

①、新增表

使用 CREATE TABLE 命令创建一个名为 user 的表。

CREATE TABLE user(name text,age int);
CREATE TABLE student(id int,name text,age int,primary key(id));
②、查看表信息

使用 .tables 或者.table tableName命令查看现有表格

sqlite> .tables
student  user   
sqlite> .tables user
user
sqlite> .table user
user
③、查看表索引信息
## user表没有建索引
sqlite> .indices user
sqlite> .indices student
sqlite_autoindex_student_1

④、查看表结构信息
sqlite> .schema
CREATE TABLE user(name text,age int);
CREATE TABLE student(id int,name text,age int,primary key(id));
sqlite> .schema student
CREATE TABLE student(id int,name text,age int,primary key(id));

2、数据记录操作

①、新增记录
sqlite> insert into user values('Tom',20);
sqlite> insert into user values('Jerry',18);
sqlite> insert into user values('Jack',25);

②、查看记录
sqlite> select * from user;
Tom|20
Jerry|18
Jack|25

③、不同格式输出
qlite> .mode help
Error: mode should be one of: column csv html insert line list tabs tcl
qlite> .mode column
sqlite> select * from user;
Tom         20        
Jerry       18        
Jack        25        
sqlite> .mode html
sqlite> select * from user;
<TR><TD>Tom</TD>
<TD>20</TD>
</TR>
<TR><TD>Jerry</TD>
<TD>18</TD>
</TR>
<TR><TD>Jack</TD>
<TD>25</TD>
</TR>
sqlite> .mode tabs
sqlite> select * from user;
Tom     20
Jerry   18
Jack    25
qlite> .mode csv
sqlite> select * from user;
Tom,20
Jerry,18
Jack,25

3、脚本文件操作

①、从文件读取sql并执行
sqlite> .quit
[root@k8s-dev sqlite]# echo "select * from user;" > user.sql
[root@k8s-dev sqlite]# sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .read user.sql
Tom|20
Jerry|18
Jack|25

②、输出到文件
sqlite> .output user.csv
sqlite> .mode csv
sqlite> select * from user;
sqlite> .quit
[root@k8s-dev sqlite]# ll
total 33380
-rwxrwxr-x 1 root root  6946064 Aug 13 19:05 sqldiff
-rwxrwxr-x 1 root root  8710792 Aug 13 19:04 sqlite3
-rwxrwxr-x 1 root root  7454784 Aug 13 19:05 sqlite3_analyzer
-rw-r--r-- 1 root root 11048231 Aug 15 14:44 sqlite-tools-linux-x64-3460100.zip
-rw-r--r-- 1 root root     2048 Aug 15 14:53 test.db
-rw-r--r-- 1 root root       72 Aug 15 14:59 user.csv
-rw-r--r-- 1 root root       19 Aug 15 14:58 user.sql
[root@k8s-dev sqlite]# cat user.csv 
Tom,20
Jerry,18
Jack,25

4、备份恢复操作

在涉及数据库操作时,备份和恢复是至关重要的步骤,它们用于防止数据丢失并确保数据的持续性。SQLite 提供了简单的方法来备份和恢复数据库。

①备份

在 SQLite 中可以通过导出整个数据库为一个 SQL 脚本来备份数据库。此功能使用 .dump 命令实现。

sqlite> .output backup-restore.sql
sqlite> .dump
sqlite> .quit
[root@k8s-dev sqlite]# ll
total 33392
-rw-r--r-- 1 root root      310 Aug 15 15:03 backup-restore.sql
-rwxrwxr-x 1 root root  6946064 Aug 13 19:05 sqldiff
-rwxrwxr-x 1 root root  8710792 Aug 13 19:04 sqlite3
-rwxrwxr-x 1 root root  7454784 Aug 13 19:05 sqlite3_analyzer
-rw-r--r-- 1 root root 11048231 Aug 15 14:44 sqlite-tools-linux-x64-3460100.zip
-rw-r--r-- 1 root root     4096 Aug 15 16:23 test.db
-rw-r--r-- 1 root root      108 Aug 15 15:00 user.csv
-rw-r--r-- 1 root root       20 Aug 15 15:00 user.sql
[root@k8s-dev sqlite]# cat backup-restore.sql 
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user(name text,age int);
INSERT INTO "user" VALUES('Tom',20);
INSERT INTO "user" VALUES('Jerry',18);
INSERT INTO "user" VALUES('Jack',25);
CREATE TABLE student(id int,name text,age int,primary key(id));
COMMIT;

②恢复

将上述备份出来的数据,恢复到一个新的数据库test-backup-restore.db上

[root@k8s-dev sqlite]# sqlite3 test-backup-restore.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
sqlite> .read backup-restore.sql 

sqlite> .tables
student  user
sqlite> select * from user;
Tom|20
Jerry|18
Jack|25

四、SQLite应用——go-sqlite3

相关链接:https://github.com/mattn/go-sqlite3

  • Golang应用SQLite代码示例
### 新建一个go-sqlite项目
[root@k8s-dev ~]# mkdir go-sqlite
[root@k8s-dev ~]# cd go-sqlite
[root@k8s-dev go-sqlite]# go mod init go-sqlie-example
go: creating new go.mod: module go-sqlie
go: to add module requirements and sums:
        go mod tidy
[root@k8s-dev go-sqlite]# go get github.com/mattn/go-sqlite3
[root@k8s-dev go-sqlite]# vim main.go
# 代码具体如下:
[root@k8s-dev go-sqlite]# cat main.go 
package main

import (
        "database/sql"
        "fmt"
        _ "github.com/mattn/go-sqlite3"
        "log"
        "os"
)

func main() {
        os.Remove("./foo.db")

        ## 新建数据库
        db, err := sql.Open("sqlite3", "./foo.db")
        if err != nil {
                log.Fatal(err)
        }
        defer db.Close()

        sqlStmt := `
        create table foo (id integer not null primary key, name text);
        delete from foo;
        `
        ## 新增表
        _, err = db.Exec(sqlStmt)
        if err != nil {
                log.Printf("%q: %s\n", err, sqlStmt)
                return
        }
        ## 开启事务
        tx, err := db.Begin()
        if err != nil {
                log.Fatal(err)
        }
        stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
        if err != nil {
                log.Fatal(err)
        }
        defer stmt.Close()
        for i := 0; i < 100; i++ {
                ## 新增记录
                _, err = stmt.Exec(i, fmt.Sprintf("hello world_%03d", i))
                if err != nil {
                        log.Fatal(err)
                }
        }
        ## 提交事务
        err = tx.Commit()
        if err != nil {
                log.Fatal(err)
        }
        ## 查看记录
        rows, err := db.Query("select id, name from foo")
        if err != nil {
                log.Fatal(err)
        }
        defer rows.Close()
        for rows.Next() {
                var id int
                var name string
                err = rows.Scan(&id, &name)
                if err != nil {
                        log.Fatal(err)
                }
                fmt.Println(id, name)
        }
        err = rows.Err()
        if err != nil {
                log.Fatal(err)
        }

        stmt, err = db.Prepare("select name from foo where id = ?")
        if err != nil {
                log.Fatal(err)
        }
        defer stmt.Close()
        var name string
        ## 查看第3条记录
        err = stmt.QueryRow("3").Scan(&name)
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(name)
        ## 删除所有记录
        _, err = db.Exec("delete from foo")
        if err != nil {
                log.Fatal(err)
        }
        ## 新增3条记录
        _, err = db.Exec("insert into foo(id, name) values(1, 'foo'), (2, 'bar'), (3, 'baz')")
        if err != nil {
                log.Fatal(err)
        }
        ## 查看所有记录
        rows, err = db.Query("select id, name from foo")
        if err != nil {
                log.Fatal(err)
        }
        defer rows.Close()
        for rows.Next() {
                var id int
                var name string
                err = rows.Scan(&id, &name)
                if err != nil {
                        log.Fatal(err)
                }
                fmt.Println(id, name)
        }
        err = rows.Err()
        if err != nil {
                log.Fatal(err)
        }
}

五、SQLite应用——微信

SQLite也是微信的客户端数据库,里面保存了包括聊天记录、联系人、设置等关于微信的几乎一切数据。

1、sqlitebrowser

SQLite可视化工具:https://github.com/sqlitebrowser/sqlitebrowser

下载之后解压,新建或者直接打开一个SQLite db文件即可完成SQLite数据的可视化操作。

2、PyWxDump

微信数据信息查看工具:https://github.com/xaoyaoo/PyWxDump

下载wxdump.exe文件之后,双击运行即可。该程序会自动扫描微信程序,并将微信数据导出到wxdump_work目录下,里面有个merge_all.db文件,该文件保存了微信的所有数据信息。用可视化工具sqlitebrowser将其打开如下所示,一共有48张表。

在这里插入图片描述

这里列举几个我们平时比较常用的表信息如下:
详见GitHub 项目PyWxDump的doc目录下的wx数据库简述.md文档

APPInfo:记录使用微信进行第三方登录的信息
ChatCRMsg:记录企业微信的信息
ChatRoom/ChatRoomInfo:记录微信群信息
Contact:记录所有联系人的信息
ContactLabel:记录联系人标签信息
FavItems:记录了微信收藏记录信息
FavTagDatas:记录收藏的标签信息
MSG:记录了微信的聊天信息,最核心的信息
Session:记录了所有会话信息
OpenIM 前缀:企业微信聊天记录数据,包括所有和企业微信聊天的数据。

3、WeChatMsg

微信数据信息导出工具:https://github.com/LC044/WeChatMsg

下载打包好的exe可执行文件,双击即可运行。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐