SQLite 数据库入门教程(GO)
作者:mmseoamin日期:2023-12-11

文章目录

  • SQLite数据库入门教程
    • 一、SQLite 简介
      • 1、什么是 SQLite?
      • 2、为什么要用 SQLite?
      • 二、SQLite 安装
        • 1、在 Windows 上安装 SQLite
        • 2、在 Linux 、Mac OS上安装 SQLite
        • 三、SQLite 命令
        • 四、SQLite 使用
          • 1、SQLite 数据类型
          • 2、SQLite 语法
          • 3、SQLite 可视化管理工具
          • 五、Go 语言使用 SQLite 数据库
            • 1、安装 go-sqlite3
            • 2、安装 mingw64
            • 3、连接数据库
            • 4、创建数据表
            • 5、插入数据
            • 6、查询数据
            • 六、实践(运费清单计算和测试程序)

              SQLite数据库入门教程

              一、SQLite 简介

              1、什么是 SQLite?

                SQLite是一个轻量级、嵌入式、跨平台的关系型数据库,是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

              2、为什么要用 SQLite?

              • 不需要一个单独的服务器进程或操作的系统(无服务器的)。它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。

              • SQLite 不需要配置,这意味着不需要安装或管理。

              • 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。使用 sqlite 打开或创建一个数据库文件,操作该文件实现对数据库的操作。

              • SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。

              • SQLite 是自给自足的,它的核心引擎本身不依赖第三方的软件。

              • SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。

              • SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。

              • SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。

              • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。

                二、SQLite 安装

                1、在 Windows 上安装 SQLite

                   请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件,你需要下载 sqlite-dll-win64-x64-3420000.zip 和 sqlite-tools-win32-x86-3420000.zip 压缩文件。

                SQLite 数据库入门教程(GO),在这里插入图片描述,第1张

                   新建文件夹 D:\SQLite,并在此文件夹中解压上面两个压缩文件,将得到以下文件。

                SQLite 数据库入门教程(GO),在这里插入图片描述,第2张

                   添加 D:\SQLite 到 PATH 环境变量,最后在命令提示符下,使用 sqlite3 命令,将显示如下结果。

                SQLite 数据库入门教程(GO),在这里插入图片描述,第3张

                2、在 Linux 、Mac OS上安装 SQLite

                   Linux 操作系统、Mac OS 系统都附带 SQLite,使用 sqlite3 命令来检查你的机器上是否已经安装了 SQLite。如果没有可用的安装,请访问 SQLite 下载页面,从源代码区下载 sqlite-autoconf-3420000.tar.gz。

                SQLite 数据库入门教程(GO),在这里插入图片描述,第4张

                使用如下步骤安装:

                $ tar xvzf sqlite-autoconf-3420000.tar.gz
                $ cd sqlite-autoconf-3420000
                $ ./configure --prefix=/usr/local
                $ make
                $ make install
                

                三、SQLite 命令

                  在 sqlite> 提示符后可以输入命令,这些命令被称为 SQLite 的点命令。确保 sqlite> 提示符与点命令之间没有空格,否则将无法正常工作。SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。

                命令描述
                .help获取可用的点命令的清单
                .exit退出 SQLite 提示符
                .show显示各种设置的当前值
                .quit退出 SQLite 提示符
                .databases列出数据库的名称及其所依附的文件
                .schema查看所有表结构
                .schema 表名查看指定表结构
                .tables查看所有表
                .tables 表名查看指定表,表存在返回表名,表不存在什么都不返回
                .header(s) ON/OFF开启或关闭头部显示
                .mode MODE设置输出模式,MODE 可以是下列之一:column 左对齐的列
                .timer ON/OFF开启或关闭 CPU 定时器

                SQLite 数据库入门教程(GO),在这里插入图片描述,第5张

                SQLite 数据库入门教程(GO),在这里插入图片描述,第6张

                四、SQLite 使用

                1、SQLite 数据类型

                  SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

                存储类描述
                NULL值是一个 NULL 值
                INTEGER值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中
                REAL值是一个浮点值,存储为 8 字节的 IEEE 浮点数字
                TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储
                BLOB值是一个 blob 数据,完全根据它的输入存储

                2、SQLite 语法

                  所有的 SQLite 语句可以以任何关键字开始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的语句以分号 ; 结束。

                • 创建数据库:sqlite3 DatabaseName.db
                  C:\Users\lenovo>sqlite3 C:\Users\lenovo\Desktop\test.db // 创建数据库
                  sqlite> .databases // 显示数据库信息
                  sqlite> .quit // 退出sqlite3的shell程序环境
                  sqlite> .open test.db // 创建数据库
                  

                  SQLite 数据库入门教程(GO),在这里插入图片描述,第7张

                    新手注意,这里有一个坑,是在cmd(在命令行)中输入,而不是打开sqlite3后在shell中输入。输入 .databases 就会显示刚创建的数据库信息(能看到创建的数据库文件及地址路径信息);输入.quit 就会退出sqlite3的shell程序环境。进入SQLite后,输入 .open 数据库名.db 方式,也可以创建数据库,如果数据库文件已经建立,则打开。这种方式不支持自定义路径。

                  • 创建表:CREATE TABLE database_name.table_name(column1 datatype PRIMARY KEY(one or more columns),column2 datatype,…);
                    sqlite> CREATE TABLE express_orders (id INTEGER PRIMARY KEY NOT NULL,uid INTEGER NOT NULL,weight DOUBLE NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP); // 创建表
                    sqlite> .schema // 查看所有表结构
                    sqlite> .tables // 查看所有表
                    

                    SQLite 数据库入门教程(GO),在这里插入图片描述,第8张

                    • 插入数据(insert):

                      INSERT INTO TABLE_NAME (column1, column2, column3,…columnN) VALUES (value1, value2, value3,…valueN);

                      INSERT INTO TABLE_NAME VALUES (value1,value2,value3,…valueN);

                      sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040228039,0.9);
                      sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040500698,67.9942); 
                      sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040524994,99.99);
                      sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040559781,100);
                      

                      SQLite 数据库入门教程(GO),在这里插入图片描述,第9张

                      • 查询数据(select):

                        SELECT * FROM table_name;(查询所有字段)

                        SELECT column1, column2, columnN FROM table_name;(查询指定字段)

                        SELECT * FROM table_name where column1 = 指定信息;(在限制条件下查询指定信息)

                        sqlite> SELECT * FROM express_orders;
                        sqlite> SELECT uid,weight FROM express_orders;
                        sqlite> SELECT * FROM express_orders where id > 1;
                        sqlite> .header on // 开启头部显示
                        sqlite> .mode column // 设置输出模式,左对齐的列
                        sqlite> SELECT * FROM express_orders;
                        sqlite> .timer on // 开启 CPU 定时器
                        sqlite> SELECT * FROM express_orders;
                        

                        SQLite 数据库入门教程(GO),在这里插入图片描述,第10张

                        SQLite 数据库入门教程(GO),在这里插入图片描述,第11张

                        • 创建索引(Index):CREATE INDEX index_name ON table_name (column_name);
                          sqlite> CREATE INDEX index_uid ON express_orders (uid); // 创建索引
                          sqlite> .schema // 查看所有表结构
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第12张

                          3、SQLite 可视化管理工具

                            SQLiteStudio是一个开源、跨平台的 SQLite 可视化管理工具。免费,多语言界面,支持 Linux,Mac 和 Windows。官方网址SQLiteStudio。

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第13张

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第14张

                          五、Go 语言使用 SQLite 数据库

                          1、安装 go-sqlite3

                            在安装go-sqlite3之前,需要先安装SQLite数据库,在Golang中通过 go get 命令安装 go-sqlite3:

                          go get github.com/mattn/go-sqlite3
                          

                          2、安装 mingw64

                            在实践中我们发现,只安装 go-sqlite3 是不可以的,无法和数据库建立连接,会报以下错误:

                          # github.com/mattn/go-sqlite3
                          cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
                          

                            报错意思是缺少 gcc 环境,我们需要装一个 gcc 环境。因为 go里面使用sqlite,实际上是要下载sqlite的源代码编译的,当然,使用的时候不用手动编译,在linux中,gcc 如果已经安装了,是不用担心的,但是在windows中,为了支持编译,必须使用 mingw64。下载后缀为 posix-seh 的,mingw64下载地址。

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第15张

                            解压下载好的文件放置任一目录,随后将 bin 目录添加进 path 环境变量中,打开 cmd ,输入 gcc -v ,如正确显示版本号则安装成功,然后重启 goland 即可。

                            如果你发现在 cmd 中已经能够找到 gcc 命令,但是goland 中执行程序还是找不到的话,那么多半就是 goland 的环境变量还未刷新,重启电脑、或者清空goland全部缓存并重启,即可解决。

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第16张

                          3、连接数据库

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
                          	_ "github.com/mattn/go-sqlite3"
                          	"log"
                          )
                          var db *sql.DB
                          var err error
                          func main() {
                          	// Open() 函数指定驱动名称和数据源名称
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	var version string
                          	// QueryRow() 执行查询,返回版本号
                          	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 连接成功,打印出"database connected:版本号"
                          	fmt.Printf("Database creation successful: %v\n", version)
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第17张

                          4、创建数据表

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
                          	_ "github.com/mattn/go-sqlite3"
                          )
                          func main() {
                          	// Open() 函数指定驱动名称和数据源名称
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	connectDB()
                          	createTable()
                          }
                          var db *sql.DB
                          var err error
                          // 连接数据库
                          func connectDB() {
                          	var version string
                          	// QueryRow() 执行查询,返回版本号
                          	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 连接成功,打印出"database connected:版本号"
                          	fmt.Printf("Database creation successful: %v\n", version)
                          }
                          // 创建数据库表
                          func createTable() {
                          	// 建表语句
                          	sts := `
                              CREATE TABLE express_orders (
                                  id INTEGER PRIMARY KEY NOT NULL,
                                  uid INTEGER NOT NULL,
                                  weight DOUBLE NOT NULL,
                                  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
                              );`
                          	// 使用db.Exec() 函数来执行 SQL 语句
                          	_, err = db.Exec(sts)
                          	if err != nil {
                          		fmt.Printf("Failed to create database table: %v\n", err)
                          		return
                          	}
                          	fmt.Printf("Successfully created database table! \n")
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第18张

                          5、插入数据

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
                          	_ "github.com/mattn/go-sqlite3"
                          )
                          func main() {
                          	// Open() 函数指定驱动名称和数据源名称
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	connectDB()
                          	insert(1, 0.81192)
                          }
                          var db *sql.DB
                          var err error
                          // 连接数据库
                          func connectDB() {
                          	var version string
                          	// QueryRow() 执行查询,返回版本号
                          	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 连接成功,打印出"database connected:版本号"
                          	fmt.Printf("Database creation successful: %v\n", version)
                          }
                          // 插入数据
                          func insert(uid int, weight float64) {
                          	// 插入语句
                          	res, err := db.Exec("INSERT INTO express_orders(uid, weight) VALUES(?,?)", uid, weight)
                          	if err != nil {
                          		fmt.Printf("Insert data failed: %v\n", err)
                          		return
                          	}
                          	// 获取自增ID
                          	lastInsertId, _ := res.LastInsertId()
                          	fmt.Printf("Successfully inserted data, lastInsertId =  %v\n", lastInsertId)
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第19张

                          6、查询数据

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
                          	_ "github.com/mattn/go-sqlite3"
                          )
                          func main() {
                          	// Open() 函数指定驱动名称和数据源名称
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	connectDB()
                          	ret := query(1)
                          	fmt.Println(ret)
                          }
                          var db *sql.DB
                          var err error
                          // 连接数据库
                          func connectDB() {
                          	var version string
                          	// QueryRow() 执行查询,返回版本号
                          	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 连接成功,打印出"database connected:版本号"
                          	fmt.Printf("Database creation successful: %v\n", version)
                          }
                          // 查询数据
                          func query(uid int) (weightList []float64) {
                          	// 结果重量集合
                          	weightList = make([]float64, 0)
                          	// 查询语句
                          	rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)
                          	if err != nil {
                          		fmt.Printf("Failed to query data: %v\n", err)
                          		return
                          	}
                          	for rows.Next() {
                          		var weight float64
                          		err = rows.Scan(&weight)
                          		if err != nil {
                          			fmt.Printf("Failed to read data: %v\n", err)
                          			continue
                          		}
                          		weightList = append(weightList, weight)
                          	}
                          	return weightList
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第20张

                          六、实践(运费清单计算和测试程序)

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第21张

                          问题 1 代码如下:

                          package main
                          import (
                          	"fmt"
                          	"math"
                          )
                          func main() {
                          	var weight float64
                          	fmt.Print("请输入实际重量(单位:KG):")
                          	fmt.Scanf("%f", &weight)
                          	if weight > 0 && weight <= 100 {
                          		fee := compute(weight)
                          		fmt.Printf("快递费用为 %d 元。\n", fee)
                          	} else {
                          		fmt.Println("实际重量输入错误!!!")
                          	}
                          }
                          // 计算快递费用
                          func compute(number float64) int {
                          	// 快递费用
                          	fee := 0
                          	// 计费重量,实际重量向上取整
                          	weight := int(math.Ceil(number))
                          	// 计算费用
                          	switch weight == 1 {
                          	case false:
                          		newFee := float64(18)
                          		for i := 2; i <= weight; i++ {
                          			newFee = 5 + newFee*1.01
                          		}
                          		newFee = math.Round(newFee)
                          		fee = int(newFee)
                          	default:
                          		fee = 18
                          	}
                          	return fee
                          }
                          

                          测试:输入0

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第22张

                          测试:输入0.81192

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第23张

                          测试:输入2.996

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第24张

                          测试:输入99.99

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第25张

                          测试:输入100

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第26张

                          测试:输入101

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第27张

                          问题 2 :

                          生成数据的代码:

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          	"math/rand"
                          	"sort"
                          	"sync"
                          	// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
                          	_ "github.com/mattn/go-sqlite3"
                          )
                          var db *sql.DB
                          var err error
                          func main() {
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	// 连接数据库
                          	connectDB()
                          	// 创建数据库表
                          	//createTable()
                          	// 生成 1000 个用户 id
                          	createUid()
                          	var wg sync.WaitGroup
                          	wg.Add(10)
                          	// 创建 10 个协程,同时往数据库里插数据
                          	for i := 0; i < 10; i++ {
                          		go func() {
                          			// 生成 100000 条订单记录并插入数据库中
                          			createRecords()
                          		}()
                          	}
                          	wg.Wait()
                          }
                          // 用户 id
                          var uidList = make([]int, 1000)
                          // 生成 1000 个用户 id
                          func createUid() {
                          	for i := 0; i < 1000; i++ {
                          		uidList[i] = i + 1
                          	}
                          }
                          // 生成 100000 条订单记录并插入数据库中
                          func createRecords() {
                          	// 值数组
                          	valueList := make([]int, 100)
                          	// 权重数组
                          	weightList := make([]float64, 100)
                          	for i := 0; i < 100; i++ {
                          		valueList[i] = 100 - i
                          		// 权重递增排序
                          		weightList[i] = 1 / float64(100-i)
                          	}
                          	// 加权
                          	totals := make([]float64, 100)
                          	// 总权重
                          	weightTotal := float64(0)
                          	for i, weight := range weightList {
                          		weightTotal += weight
                          		totals[i] = weightTotal
                          	}
                          	// 插入 10000 条订单记录
                          	for i := 0; i < 10000; i++ {
                          		// 生成一个 1000 以内的整形随机数(包含 0 )
                          		n := rand.Intn(1000)
                          		// 取用户 id
                          		uid := uidList[n]
                          		// 使用总权重获取随机数,避免超过范围,随机生成的数需要排除0,故加 0.01
                          		num := rand.Float64()*weightTotal + 0.01
                          		// 核心点,使用二分法,找到对应的下标,如果没有则为大于该数的+1 下标,可能为len(a)即数组长度
                          		index := sort.SearchFloat64s(totals, num)
                          		// 根据下标去值数组中取数,放到结果数组中
                          		weight := valueList[index%100]
                          		insert(uid, weight)
                          	}
                          }
                          // 连接数据库
                          func connectDB() {
                          	var version string
                          	// QueryRow() 执行查询,返回版本号
                          	err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 连接成功,打印出"database connected:版本号"
                          	fmt.Printf("Database creation successful: %v\n", version)
                          }
                          // 创建数据库表
                          func createTable() {
                          	// 建表语句
                          	sts := `
                              CREATE TABLE express_orders (
                                  id INTEGER PRIMARY KEY NOT NULL,
                                  uid INTEGER NOT NULL,
                                  weight DOUBLE NOT NULL,
                                  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
                              );`
                          	// 使用db.Exec() 函数来执行 SQL 语句
                          	_, err = db.Exec(sts)
                          	if err != nil {
                          		fmt.Printf("Failed to create database table: %v\n", err)
                          		return
                          	}
                          	fmt.Printf("Successfully created database table! \n")
                          }
                          // 插入数据
                          func insert(uid int, weight int) {
                          	// 插入语句
                          	res, err := db.Exec("INSERT INTO express_orders(uid, weight) VALUES(?,?)", uid, weight)
                          	if err != nil {
                          		fmt.Printf("Insert data failed: %v\n", err)
                          		return
                          	}
                          	// 获取自增ID
                          	lastInsertId, _ := res.LastInsertId()
                          	fmt.Printf("Successfully inserted data, lastInsertId =  %v\n", lastInsertId)
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第28张

                          查询功能的代码:

                          package main
                          import (
                          	"database/sql"
                          	"fmt"
                          )
                          type order struct {
                          	id         int
                          	uid        int
                          	weight     float64
                          	createTime string
                          }
                          func main() {
                          	var uid int
                          	fmt.Print("请输入 1 个用户 id:")
                          	fmt.Scanf("%f", &uid)
                          	db, err = sql.Open("sqlite3", "data.db")
                          	if err != nil {
                          		fmt.Printf("Database creation failed: %v\n", err)
                          		return
                          	}
                          	// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
                          	defer db.Close()
                          	
                          	weightList := query(uid)
                          	fmt.Println(weightList)
                          	cost := 0
                          	for _, val := range weightList {
                          		fee := compute(val.weight)
                          		cost += fee
                          	}
                          	fmt.Printf("该用户总的快递费用为 %d 元。\n", cost)
                          }
                          // 查询数据
                          func query(uid int) (weightList []order) {
                          	// 结果重量集合
                          	weightList = make([]order, 0)
                          	// 查询语句
                          	rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)
                          	if err != nil {
                          		fmt.Printf("Failed to query data: %v\n", err)
                          		return
                          	}
                          	defer rows.Close()
                          	fmt.Println(rows.Next())
                          	fmt.Println(rows.Columns())
                          	for rows.Next() {
                          		var id int
                          		var weight float64
                          		var createTime string
                          		err = rows.Scan(&id, &uid, &weight, &createTime)
                          		if err != nil {
                          			fmt.Printf("Failed to read data: %v\n", err)
                          			continue
                          		}
                          		fmt.Println(id, uid)
                          		orderRow := order{id: id, uid: uid, weight: weight, createTime: createTime}
                          		weightList = append(weightList, orderRow)
                          	}
                          	return weightList
                          }
                          

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第29张

                          SQLite 数据库入门教程(GO),在这里插入图片描述,第30张