解决方案

SQLite 数据库入门教程(GO)

seo靠我 2023-09-24 16:32:49

文章目录

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

SQLite数据库入门教程

一、SQLite 简介

1、什么SEO靠我是 SQLite?

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

2、为什么要用 SQLite?

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

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

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

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

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

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

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

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

SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(WSEO靠我in32, WinCE, WinRT)中运行。

二、SQLite 安装

1、在 Windows 上安装 SQLite

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

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

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

2、在 Linux 、Mac OS上安装 SQLiSEO靠我te

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

使用如下步骤安装:

$ tar xvzf sqlite-autoconf-3420000.tar.gz $ cd sqSEO靠我lite-autoconf-3420000 $ ./configure --prefix=/usr/local $ make $ make instalSEO靠我l

三、SQLite 命令

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

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

四、SQLite 使用

1、SQLite 数据类型

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

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

2、SQLite 语法

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

创建数据库:sqlite3 DatabaseName.dbC:\Users\lenovo>sqliteSEO靠我3 C:\Users\lenovo\Desktop\test.db // 创建数据库 sqlite> .databases // 显示数据库信息 sqlite> .quSEO靠我it // 退出sqlite3的shell程序环境 sqlite> .open test.db // 创建数据库

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

创建表:CREATE TABLE database_name.table_namSEO靠我e(column1 datatype PRIMARY KEY(one or more columns),column2 datatype,…);

sqlite> CREATE TABLE expressSEO靠我_orders (id INTEGER PRIMARY KEY NOT NULL,uid INTEGER NOT NULL,weight DOUBLE NOT NULL,created_at DATESEO靠我TIME NOT NULL DEFAULT CURRENT_TIMESTAMP); // 创建表 sqlite> .schema // 查看所有表结构 SEO靠我sqlite> .tables // 查看所有表 插入数据(insert):

INSERT INTO TABLE_NAME (column1, column2, columnSEO靠我3,…columnN) VALUES (value1, value2, value3,…valueN);

INSERT INTO TABLE_NAME VALUES (value1,value2,valSEO靠我ue3,…valueN);

sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040228039,0.9); SEO靠我 sqlite> INSERT INTO express_orders (uid,weight) VALUES (1685040500698,67.9942); sqlite>SEO靠我 INSERT INTO express_orders (uid,weight) VALUES (1685040524994,99.99); sqlite> INSERT INSEO靠我TO express_orders (uid,weight) VALUES (1685040559781,100); 查询数据(select):

SELECT * FROM SEO靠我table_name;(查询所有字段) SELECT column1, column2, columnN FROM table_name;(查询指定字段) SELECT * FROM table_nameSEO靠我 where column1 = 指定信息;(在限制条件下查询指定信息)sqlite> SELECT * FROM express_orders; sqlite> SELECT uidSEO靠我,weight FROM express_orders; sqlite> SELECT * FROM express_orders where id > 1; sqliSEO靠我te> .header on // 开启头部显示 sqlite> .mode column // 设置输出模式,左对齐的列 sqlite> SELECT * FROM SEO靠我express_orders; sqlite> .timer on // 开启 CPU 定时器 sqlite> SELECT * FROM express_ordersSEO靠我; 创建索引(Index):CREATE INDEX index_name ON table_name (column_name);sqlite> CREATE INDEX indSEO靠我ex_uid ON express_orders (uid); // 创建索引 sqlite> .schema // 查看所有表结构

3、SQLite 可视化管理工具

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

五、Go 语言使用 SQLite 数据库

1、安SEO靠我装 go-sqlite3

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

go get github.com/mattnSEO靠我/go-sqlite3

2、安装 mingw64

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

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

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

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

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

3、连接数据库

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

4、创建数据表

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

5、插入数据

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

6、查询数据

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

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

问题 1 代码如下:

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

测试:输入0

测试:输入0.SEO靠我81192

测试:输入2.996

测试:输入99.99

测试:输入100

测试:输入101

问题 2 :

生成数据的代码:

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

查询功能的代码:

package mainimport ("databaseSEO靠我/sql""fmt" )type order struct {id intuid intweight float64createTime string }func maSEO靠我in() {var uid intfmt.Print("请输入 1 个用户 id:")fmt.Scanf("%f", &uid)db, err = sql.Open("sqlite3", "data.SEO靠我db")if err != nil {fmt.Printf("Database creation failed: %v\n", err)return}// 调用db.Close() 函数,确保关闭数据SEO靠我库并阻止启动新的查询defer db.Close()weightList := query(uid)fmt.Println(weightList)cost := 0for _, val := rangSEO靠我e weightList {fee := compute(val.weight)cost += fee}fmt.Printf("该用户总的快递费用为 %d 元。\n", cost) }SEO靠我// 查询数据 func query(uid int) (weightList []order) {// 结果重量集合weightList = make([]order, 0)// 查SEO靠我询语句rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)if err != nil {fmt.PSEO靠我rintf("Failed to query data: %v\n", err)return}defer rows.Close()fmt.Println(rows.Next())fmt.PrintlnSEO靠我(rows.Columns())for rows.Next() {var id intvar weight float64var createTime stringerr = rows.Scan(&iSEO靠我d, &uid, &weight, &createTime)if err != nil {fmt.Printf("Failed to read data: %v\n", err)continue}fmSEO靠我t.Println(id, uid)orderRow := order{id: id, uid: uid, weight: weight, createTime: createTime}weightLSEO靠我ist = append(weightList, orderRow)}return weightList }
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2