SQLite數(shù)據(jù)庫入門教程
一、SQLite 簡(jiǎn)介
1、什么是 SQLite?
??SQLite是一個(gè)輕量級(jí)、嵌入式、跨平臺(tái)的關(guān)系型數(shù)據(jù)庫,是一個(gè)進(jìn)程內(nèi)的庫,實(shí)現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎。它是一個(gè)零配置的數(shù)據(jù)庫,這意味著與其他數(shù)據(jù)庫不一樣,您不需要在系統(tǒng)中配置。就像其他數(shù)據(jù)庫,SQLite 引擎不是一個(gè)獨(dú)立的進(jìn)程,可以按應(yīng)用程序需求進(jìn)行靜態(tài)或動(dòng)態(tài)連接。SQLite 直接訪問其存儲(chǔ)文件。
2、為什么要用 SQLite?
-
不需要一個(gè)單獨(dú)的服務(wù)器進(jìn)程或操作的系統(tǒng)(無服務(wù)器的)。它是進(jìn)程內(nèi)的數(shù)據(jù)庫引擎,因此不存在數(shù)據(jù)庫的客戶端和服務(wù)器。
-
SQLite 不需要配置,這意味著不需要安裝或管理。
-
一個(gè)完整的 SQLite 數(shù)據(jù)庫是存儲(chǔ)在一個(gè)單一的跨平臺(tái)的磁盤文件。使用 sqlite 打開或創(chuàng)建一個(gè)數(shù)據(jù)庫文件,操作該文件實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作。
-
SQLite 是非常小的,是輕量級(jí)的,完全配置時(shí)小于 400KiB,省略可選功能配置時(shí)小于250KiB。
-
SQLite 是自給自足的,它的核心引擎本身不依賴第三方的軟件。
-
SQLite 事務(wù)是完全兼容 ACID 的,允許從多個(gè)進(jìn)程或線程安全訪問。
-
SQLite 支持 SQL92(SQL2)標(biāo)準(zhǔn)的大多數(shù)查詢語言的功能。
-
SQLite 使用 ANSI-C 編寫的,并提供了簡(jiǎn)單和易于使用的 API。
-
SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中運(yùn)行。
二、SQLite 安裝
1、在 Windows 上安裝 SQLite
?? 請(qǐng)?jiān)L問 SQLite 下載頁面,從 Windows 區(qū)下載預(yù)編譯的二進(jìn)制文件,你需要下載 sqlite-dll-win64-x64-3420000.zip 和 sqlite-tools-win32-x86-3420000.zip 壓縮文件。
?? 新建文件夾 D:\SQLite,并在此文件夾中解壓上面兩個(gè)壓縮文件,將得到以下文件。
?? 添加 D:\SQLite 到 PATH 環(huán)境變量,最后在命令提示符下,使用 sqlite3 命令,將顯示如下結(jié)果。
2、在 Linux 、Mac OS上安裝 SQLite
?? Linux 操作系統(tǒng)、Mac OS 系統(tǒng)都附帶 SQLite,使用 sqlite3 命令來檢查你的機(jī)器上是否已經(jīng)安裝了 SQLite。如果沒有可用的安裝,請(qǐng)?jiān)L問 SQLite 下載頁面,從源代碼區(qū)下載 sqlite-autoconf-3420000.tar.gz。
使用如下步驟安裝:
$ tar xvzf sqlite-autoconf-3420000.tar.gz
$ cd sqlite-autoconf-3420000
$ ./configure --prefix=/usr/local
$ make
$ make install
三、SQLite 命令
??在 sqlite> 提示符后可以輸入命令,這些命令被稱為 SQLite 的點(diǎn)命令。確保 sqlite> 提示符與點(diǎn)命令之間沒有空格,否則將無法正常工作。SQLite 是不區(qū)分大小寫的,但也有一些命令是大小寫敏感的,比如 GLOB 和 glob 在 SQLite 的語句中有不同的含義。
命令 | 描述 |
---|---|
.help | 獲取可用的點(diǎn)命令的清單 |
.exit | 退出 SQLite 提示符 |
.show | 顯示各種設(shè)置的當(dāng)前值 |
.quit | 退出 SQLite 提示符 |
.databases | 列出數(shù)據(jù)庫的名稱及其所依附的文件 |
.schema | 查看所有表結(jié)構(gòu) |
.schema 表名 | 查看指定表結(jié)構(gòu) |
.tables | 查看所有表 |
.tables 表名 | 查看指定表,表存在返回表名,表不存在什么都不返回 |
.header(s) ON/OFF | 開啟或關(guān)閉頭部顯示 |
.mode MODE | 設(shè)置輸出模式,MODE 可以是下列之一:column 左對(duì)齊的列 |
.timer ON/OFF | 開啟或關(guān)閉 CPU 定時(shí)器 |
四、SQLite 使用
1、SQLite 數(shù)據(jù)類型
??SQLite 數(shù)據(jù)類型是一個(gè)用來指定任何對(duì)象的數(shù)據(jù)類型的屬性。SQLite 中的每一列,每個(gè)變量和表達(dá)式都有相關(guān)的數(shù)據(jù)類型。您可以在創(chuàng)建表的同時(shí)使用這些數(shù)據(jù)類型。SQLite 使用一個(gè)更普遍的動(dòng)態(tài)類型系統(tǒng)。在 SQLite 中,值的數(shù)據(jù)類型與值本身是相關(guān)的,而不是與它的容器相關(guān)。
存儲(chǔ)類 | 描述 |
---|---|
NULL | 值是一個(gè) NULL 值 |
INTEGER | 值是一個(gè)帶符號(hào)的整數(shù),根據(jù)值的大小存儲(chǔ)在 1、2、3、4、6 或 8 字節(jié)中 |
REAL | 值是一個(gè)浮點(diǎn)值,存儲(chǔ)為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字 |
TEXT | 值是一個(gè)文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲(chǔ) |
BLOB | 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲(chǔ) |
2、SQLite 語法
??所有的 SQLite 語句可以以任何關(guān)鍵字開始,如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP 等,所有的語句以分號(hào) ; 結(jié)束。
- 創(chuàng)建數(shù)據(jù)庫:sqlite3 DatabaseName.db
C:\Users\lenovo>sqlite3 C:\Users\lenovo\Desktop\test.db // 創(chuàng)建數(shù)據(jù)庫
sqlite> .databases // 顯示數(shù)據(jù)庫信息
sqlite> .quit // 退出sqlite3的shell程序環(huán)境
sqlite> .open test.db // 創(chuàng)建數(shù)據(jù)庫
??新手注意,這里有一個(gè)坑,是在cmd(在命令行)中輸入,而不是打開sqlite3后在shell中輸入。輸入 .databases 就會(huì)顯示剛創(chuàng)建的數(shù)據(jù)庫信息(能看到創(chuàng)建的數(shù)據(jù)庫文件及地址路徑信息);輸入.quit 就會(huì)退出sqlite3的shell程序環(huán)境。進(jìn)入SQLite后,輸入 .open 數(shù)據(jù)庫名.db 方式,也可以創(chuàng)建數(shù)據(jù)庫,如果數(shù)據(jù)庫文件已經(jīng)建立,則打開。這種方式不支持自定義路徑。
- 創(chuàng)建表: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); // 創(chuàng)建表
sqlite> .schema // 查看所有表結(jié)構(gòu)
sqlite> .tables // 查看所有表
- 插入數(shù)據(jù)(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);
- 查詢數(shù)據(jù)(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 // 設(shè)置輸出模式,左對(duì)齊的列
sqlite> SELECT * FROM express_orders;
sqlite> .timer on // 開啟 CPU 定時(shí)器
sqlite> SELECT * FROM express_orders;
- 創(chuàng)建索引(Index):CREATE INDEX index_name ON table_name (column_name);
sqlite> CREATE INDEX index_uid ON express_orders (uid); // 創(chuàng)建索引
sqlite> .schema // 查看所有表結(jié)構(gòu)
3、SQLite 可視化管理工具
??SQLiteStudio是一個(gè)開源、跨平臺(tái)的 SQLite 可視化管理工具。免費(fèi),多語言界面,支持 Linux,Mac 和 Windows。官方網(wǎng)址SQLiteStudio。
五、Go 語言使用 SQLite 數(shù)據(jù)庫
1、安裝 go-sqlite3
??在安裝go-sqlite3之前,需要先安裝SQLite數(shù)據(jù)庫,在Golang中通過 go get 命令安裝 go-sqlite3:
go get github.com/mattn/go-sqlite3
2、安裝 mingw64
??在實(shí)踐中我們發(fā)現(xiàn),只安裝 go-sqlite3 是不可以的,無法和數(shù)據(jù)庫建立連接,會(huì)報(bào)以下錯(cuò)誤:
# github.com/mattn/go-sqlite3
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
??報(bào)錯(cuò)意思是缺少 gcc 環(huán)境,我們需要裝一個(gè) gcc 環(huán)境。因?yàn)?go里面使用sqlite,實(shí)際上是要下載sqlite的源代碼編譯的,當(dāng)然,使用的時(shí)候不用手動(dòng)編譯,在linux中,gcc 如果已經(jīng)安裝了,是不用擔(dān)心的,但是在windows中,為了支持編譯,必須使用 mingw64。下載后綴為 posix-seh 的,mingw64下載地址。
??解壓下載好的文件放置任一目錄,隨后將 bin 目錄添加進(jìn) path 環(huán)境變量中,打開 cmd ,輸入 gcc -v ,如正確顯示版本號(hào)則安裝成功,然后重啟 goland 即可。
??如果你發(fā)現(xiàn)在 cmd 中已經(jīng)能夠找到 gcc 命令,但是goland 中執(zhí)行程序還是找不到的話,那么多半就是 goland 的環(huán)境變量還未刷新,重啟電腦、或者清空goland全部緩存并重啟,即可解決。
3、連接數(shù)據(jù)庫
package main
import (
"database/sql"
"fmt"
// 導(dǎo)入包,導(dǎo)入前綴為下劃線,則init函數(shù)被執(zhí)行,然后注冊(cè)驅(qū)動(dòng)。
_ "github.com/mattn/go-sqlite3"
"log"
)
var db *sql.DB
var err error
func main() {
// Open() 函數(shù)指定驅(qū)動(dòng)名稱和數(shù)據(jù)源名稱
db, err = sql.Open("sqlite3", "data.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
var version string
// QueryRow() 執(zhí)行查詢,返回版本號(hào)
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 連接成功,打印出"database connected:版本號(hào)"
fmt.Printf("Database creation successful: %v\n", version)
}
4、創(chuàng)建數(shù)據(jù)表
package main
import (
"database/sql"
"fmt"
// 導(dǎo)入包,導(dǎo)入前綴為下劃線,則init函數(shù)被執(zhí)行,然后注冊(cè)驅(qū)動(dòng)。
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Open() 函數(shù)指定驅(qū)動(dòng)名稱和數(shù)據(jù)源名稱
db, err = sql.Open("sqlite3", "data.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
connectDB()
createTable()
}
var db *sql.DB
var err error
// 連接數(shù)據(jù)庫
func connectDB() {
var version string
// QueryRow() 執(zhí)行查詢,返回版本號(hào)
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 連接成功,打印出"database connected:版本號(hào)"
fmt.Printf("Database creation successful: %v\n", version)
}
// 創(chuàng)建數(shù)據(jù)庫表
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() 函數(shù)來執(zhí)行 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、插入數(shù)據(jù)
package main
import (
"database/sql"
"fmt"
// 導(dǎo)入包,導(dǎo)入前綴為下劃線,則init函數(shù)被執(zhí)行,然后注冊(cè)驅(qū)動(dòng)。
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Open() 函數(shù)指定驅(qū)動(dòng)名稱和數(shù)據(jù)源名稱
db, err = sql.Open("sqlite3", "data.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
connectDB()
insert(1, 0.81192)
}
var db *sql.DB
var err error
// 連接數(shù)據(jù)庫
func connectDB() {
var version string
// QueryRow() 執(zhí)行查詢,返回版本號(hào)
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 連接成功,打印出"database connected:版本號(hào)"
fmt.Printf("Database creation successful: %v\n", version)
}
// 插入數(shù)據(jù)
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、查詢數(shù)據(jù)
package main
import (
"database/sql"
"fmt"
// 導(dǎo)入包,導(dǎo)入前綴為下劃線,則init函數(shù)被執(zhí)行,然后注冊(cè)驅(qū)動(dòng)。
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Open() 函數(shù)指定驅(qū)動(dòng)名稱和數(shù)據(jù)源名稱
db, err = sql.Open("sqlite3", "data.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
connectDB()
ret := query(1)
fmt.Println(ret)
}
var db *sql.DB
var err error
// 連接數(shù)據(jù)庫
func connectDB() {
var version string
// QueryRow() 執(zhí)行查詢,返回版本號(hào)
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 連接成功,打印出"database connected:版本號(hào)"
fmt.Printf("Database creation successful: %v\n", version)
}
// 查詢數(shù)據(jù)
func query(uid int) (weightList []float64) {
// 結(jié)果重量集合
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
}
六、實(shí)踐(運(yùn)費(fèi)清單計(jì)算和測(cè)試程序)
問題 1 代碼如下:
package main
import (
"fmt"
"math"
)
func main() {
var weight float64
fmt.Print("請(qǐng)輸入實(shí)際重量(單位:KG):")
fmt.Scanf("%f", &weight)
if weight > 0 && weight <= 100 {
fee := compute(weight)
fmt.Printf("快遞費(fèi)用為 %d 元。\n", fee)
} else {
fmt.Println("實(shí)際重量輸入錯(cuò)誤?。?!")
}
}
// 計(jì)算快遞費(fèi)用
func compute(number float64) int {
// 快遞費(fèi)用
fee := 0
// 計(jì)費(fèi)重量,實(shí)際重量向上取整
weight := int(math.Ceil(number))
// 計(jì)算費(fèi)用
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
}
測(cè)試:輸入0
測(cè)試:輸入0.81192
測(cè)試:輸入2.996
測(cè)試:輸入99.99
測(cè)試:輸入100
測(cè)試:輸入101
問題 2 :
生成數(shù)據(jù)的代碼:
package main
import (
"database/sql"
"fmt"
"math/rand"
"sort"
"sync"
// 導(dǎo)入包,導(dǎo)入前綴為下劃線,則init函數(shù)被執(zhí)行,然后注冊(cè)驅(qū)動(dòng)。
_ "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
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
// 連接數(shù)據(jù)庫
connectDB()
// 創(chuàng)建數(shù)據(jù)庫表
//createTable()
// 生成 1000 個(gè)用戶 id
createUid()
var wg sync.WaitGroup
wg.Add(10)
// 創(chuàng)建 10 個(gè)協(xié)程,同時(shí)往數(shù)據(jù)庫里插數(shù)據(jù)
for i := 0; i < 10; i++ {
go func() {
// 生成 100000 條訂單記錄并插入數(shù)據(jù)庫中
createRecords()
}()
}
wg.Wait()
}
// 用戶 id
var uidList = make([]int, 1000)
// 生成 1000 個(gè)用戶 id
func createUid() {
for i := 0; i < 1000; i++ {
uidList[i] = i + 1
}
}
// 生成 100000 條訂單記錄并插入數(shù)據(jù)庫中
func createRecords() {
// 值數(shù)組
valueList := make([]int, 100)
// 權(quán)重?cái)?shù)組
weightList := make([]float64, 100)
for i := 0; i < 100; i++ {
valueList[i] = 100 - i
// 權(quán)重遞增排序
weightList[i] = 1 / float64(100-i)
}
// 加權(quán)
totals := make([]float64, 100)
// 總權(quán)重
weightTotal := float64(0)
for i, weight := range weightList {
weightTotal += weight
totals[i] = weightTotal
}
// 插入 10000 條訂單記錄
for i := 0; i < 10000; i++ {
// 生成一個(gè) 1000 以內(nèi)的整形隨機(jī)數(shù)(包含 0 )
n := rand.Intn(1000)
// 取用戶 id
uid := uidList[n]
// 使用總權(quán)重獲取隨機(jī)數(shù),避免超過范圍,隨機(jī)生成的數(shù)需要排除0,故加 0.01
num := rand.Float64()*weightTotal + 0.01
// 核心點(diǎn),使用二分法,找到對(duì)應(yīng)的下標(biāo),如果沒有則為大于該數(shù)的+1 下標(biāo),可能為len(a)即數(shù)組長(zhǎng)度
index := sort.SearchFloat64s(totals, num)
// 根據(jù)下標(biāo)去值數(shù)組中取數(shù),放到結(jié)果數(shù)組中
weight := valueList[index%100]
insert(uid, weight)
}
}
// 連接數(shù)據(jù)庫
func connectDB() {
var version string
// QueryRow() 執(zhí)行查詢,返回版本號(hào)
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 連接成功,打印出"database connected:版本號(hào)"
fmt.Printf("Database creation successful: %v\n", version)
}
// 創(chuàng)建數(shù)據(jù)庫表
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() 函數(shù)來執(zhí)行 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")
}
// 插入數(shù)據(jù)
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)
}
查詢功能的代碼:
package main
import (
"database/sql"
"fmt"
)
type order struct {
id int
uid int
weight float64
createTime string
}
func main() {
var uid int
fmt.Print("請(qǐng)輸入 1 個(gè)用戶 id:")
fmt.Scanf("%f", &uid)
db, err = sql.Open("sqlite3", "data.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 調(diào)用db.Close() 函數(shù),確保關(guān)閉數(shù)據(jù)庫并阻止啟動(dòng)新的查詢
defer db.Close()
weightList := query(uid)
fmt.Println(weightList)
cost := 0
for _, val := range weightList {
fee := compute(val.weight)
cost += fee
}
fmt.Printf("該用戶總的快遞費(fèi)用為 %d 元。\n", cost)
}
// 查詢數(shù)據(jù)
func query(uid int) (weightList []order) {
// 結(jié)果重量集合
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
}
文章來源:http://www.zghlxwxcb.cn/news/detail-778547.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-778547.html
到了這里,關(guān)于SQLite 數(shù)據(jù)庫入門教程(GO)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!