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 // 创建数据库
新手注意,这里有一个坑,是在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 // 查看所有表
- 插入数据(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);
- 查询数据(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;
- 创建索引(Index):CREATE INDEX index_name ON table_name (column_name);
sqlite> CREATE INDEX index_uid ON express_orders (uid); // 创建索引
sqlite> .schema // 查看所有表结构
3、SQLite 可视化管理工具
SQLiteStudio是一个开源、跨平台的 SQLite 可视化管理工具。免费,多语言界面,支持 Linux,Mac 和 Windows。官方网址SQLiteStudio。
五、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下载地址。
解压下载好的文件放置任一目录,随后将 bin 目录添加进 path 环境变量中,打开 cmd ,输入 gcc -v ,如正确显示版本号则安装成功,然后重启 goland 即可。
如果你发现在 cmd 中已经能够找到 gcc 命令,但是goland 中执行程序还是找不到的话,那么多半就是 goland 的环境变量还未刷新,重启电脑、或者清空goland全部缓存并重启,即可解决。
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)
}
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")
}
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)
}
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
}
六、实践(运费清单计算和测试程序)
问题 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
测试:输入0.81192
测试:输入2.996
测试:输入99.99
测试:输入100
测试:输入101
问题 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()
![img](https://img-blog.csdnimg.cn/img_convert/faed0631244397a91e8517cb9c9b1af2.png)
![img](https://img-blog.csdnimg.cn/img_convert/e75970ab580de0af1e6a28b2f4a07063.png)
![img](https://img-blog.csdnimg.cn/img_convert/fce8a43240d55e7e014ebfe7ee20ac10.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
划线,则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()
[外链图片转存中...(img-WwiOh1mf-1726099707815)]
[外链图片转存中...(img-NA3nF81X-1726099707816)]
[外链图片转存中...(img-Ely3tgUz-1726099707817)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**