国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQLite 數(shù)據(jù)庫入門教程(GO)

這篇具有很好參考價(jià)值的文章主要介紹了SQLite 數(shù)據(jù)庫入門教程(GO)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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 壓縮文件。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

?? 新建文件夾 D:\SQLite,并在此文件夾中解壓上面兩個(gè)壓縮文件,將得到以下文件。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

?? 添加 D:\SQLite 到 PATH 環(huán)境變量,最后在命令提示符下,使用 sqlite3 命令,將顯示如下結(jié)果。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

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。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

使用如下步驟安裝:

$ 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學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

四、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ù)庫

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

??新手注意,這里有一個(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 // 查看所有表

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

  • 插入數(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);

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

  • 查詢數(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;

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

  • 創(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)

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

3、SQLite 可視化管理工具

??SQLiteStudio是一個(gè)開源、跨平臺(tái)的 SQLite 可視化管理工具。免費(fèi),多語言界面,支持 Linux,Mac 和 Windows。官方網(wǎng)址SQLiteStudio。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

五、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下載地址。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

??解壓下載好的文件放置任一目錄,隨后將 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全部緩存并重啟,即可解決。

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

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)
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

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")
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

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)
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

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
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

六、實(shí)踐(運(yùn)費(fèi)清單計(jì)算和測(cè)試程序)

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

問題 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
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
測(cè)試:輸入0.81192
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
測(cè)試:輸入2.996
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
測(cè)試:輸入99.99
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang
測(cè)試:輸入100
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

測(cè)試:輸入101
sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

問題 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)
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

查詢功能的代碼:

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
}

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang

sqlite學(xué)習(xí),數(shù)據(jù)庫,數(shù)據(jù)庫,sqlite,golang文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Jmeter(六) - 從入門到精通 - 建立數(shù)據(jù)庫測(cè)試計(jì)劃(詳解教程)

    Jmeter(六) - 從入門到精通 - 建立數(shù)據(jù)庫測(cè)試計(jì)劃(詳解教程)

    1.簡(jiǎn)介 ? 在實(shí)際工作中,我們經(jīng)常會(huì)聽到數(shù)據(jù)庫的性能和穩(wěn)定性等等,這些有時(shí)候也需要測(cè)試工程師去評(píng)估和測(cè)試,因此這篇文章主要介紹了jmeter連接和創(chuàng)建數(shù)據(jù)庫測(cè)試計(jì)劃的過程,在文中通過示例和代碼非常詳細(xì)地介紹給大家,希望對(duì)各位小伙伴和童鞋們的學(xué)習(xí)或者工作具有

    2024年02月13日
    瀏覽(20)
  • 【入門必看,MySQL從0到1系列- 數(shù)據(jù)庫保姆級(jí)圖解教程:輕松掌握數(shù)據(jù)庫管理技能】

    【入門必看,MySQL從0到1系列- 數(shù)據(jù)庫保姆級(jí)圖解教程:輕松掌握數(shù)據(jù)庫管理技能】

    MySQL 是全球最流行的用于管理關(guān)系數(shù)據(jù)庫的開源數(shù)據(jù)庫軟件。除了具有強(qiáng)大的功能外,它還比 Microsoft SQL Server 和 Oracle 數(shù)據(jù)庫快速、可擴(kuò)展且更易于使用。因此,PHP 腳本通常用于創(chuàng)建功能強(qiáng)大且動(dòng)態(tài)的服務(wù)器端/基于 Web 的應(yīng)用程序。 注意: ?數(shù)據(jù)庫是數(shù)據(jù)的結(jié)構(gòu)化集合 SQL

    2024年02月09日
    瀏覽(30)
  • 《Microsoft SQL Server入門教程》第03篇 示例數(shù)據(jù)庫和示例表

    《Microsoft SQL Server入門教程》第03篇 示例數(shù)據(jù)庫和示例表

    在接下來的教程中,我們將會(huì)使用一個(gè)名為 BikeStores 的示例數(shù)據(jù)庫,它的實(shí)體關(guān)系圖(ERD)如下: 從上圖可以看出,BikeStores 數(shù)據(jù)可靠包含兩個(gè)模式(Schema),分別是 sales 和 production。這兩個(gè)模式總共包含 9 個(gè)數(shù)據(jù)表。 sales.customers sales.customers 表存儲(chǔ)了客戶的信息,包括名字

    2024年02月05日
    瀏覽(16)
  • 【入門必看,MySQL從0到1系列- 數(shù)據(jù)庫保姆級(jí)圖解教程:輕松掌握數(shù)據(jù)庫管理技能】+福利網(wǎng)盤分享MySQL從0到1資料+課程教程+視頻+源碼

    【入門必看,MySQL從0到1系列- 數(shù)據(jù)庫保姆級(jí)圖解教程:輕松掌握數(shù)據(jù)庫管理技能】+福利網(wǎng)盤分享MySQL從0到1資料+課程教程+視頻+源碼

    MySQL 是全球最流行的用于管理關(guān)系數(shù)據(jù)庫的開源數(shù)據(jù)庫軟件。除了具有強(qiáng)大的功能外,它還比 Microsoft SQL Server 和 Oracle 數(shù)據(jù)庫快速、可擴(kuò)展且更易于使用。因此,PHP 腳本通常用于創(chuàng)建功能強(qiáng)大且動(dòng)態(tài)的服務(wù)器端/基于 Web 的應(yīng)用程序。 注意: ?數(shù)據(jù)庫是數(shù)據(jù)的結(jié)構(gòu)化集合 SQL

    2024年02月08日
    瀏覽(31)
  • Linux系統(tǒng)下SQLite創(chuàng)建數(shù)據(jù)庫, 建表, 插入數(shù)據(jù)保姆級(jí)教程

    Linux系統(tǒng)下SQLite創(chuàng)建數(shù)據(jù)庫, 建表, 插入數(shù)據(jù)保姆級(jí)教程

    1,創(chuàng)建數(shù)據(jù)庫: sqlite test.db? 我這邊是sqlite2版本, 直接使用命令sqlite test.db創(chuàng)建一個(gè)名稱為test的數(shù)據(jù)庫; test是你自定義是數(shù)據(jù)庫名 , 創(chuàng)建好數(shù)據(jù)庫后, 接下來開始創(chuàng)建表格 2.創(chuàng)建表格, 就是常規(guī)的sql建表語句 CREATE TABLE ?ids_logs ( english_details TEXT, chinese_details TEXT, event_definition TEXT

    2024年02月08日
    瀏覽(27)
  • 【教程】navicat配合HTTP通道遠(yuǎn)程連接SQLite數(shù)據(jù)庫

    【教程】navicat配合HTTP通道遠(yuǎn)程連接SQLite數(shù)據(jù)庫

    ??緣由 好奇的我想查看服務(wù)器上寶塔面板的SQLite數(shù)據(jù)庫 久別一月,特來水文。起因是我看到 服務(wù)器上搭建的寶塔面板 ,好奇其中使用的 SQLite數(shù)據(jù)庫 ,想用 navicat遠(yuǎn)程連接 看一下,奈何不會(huì)玩,特來寫一篇文章解析一下,如何通過Navicat Premium工具下 ntunnel_sqlite.php 工具 配合

    2024年02月04日
    瀏覽(21)
  • 【Android入門到項(xiàng)目實(shí)戰(zhàn)--4.5】—— SQLite數(shù)據(jù)庫存儲(chǔ)實(shí)現(xiàn)增刪改查

    【Android入門到項(xiàng)目實(shí)戰(zhàn)--4.5】—— SQLite數(shù)據(jù)庫存儲(chǔ)實(shí)現(xiàn)增刪改查

    目錄 一、添加數(shù)據(jù) 二、更新數(shù)據(jù) 三、刪除數(shù)據(jù) 四、查詢數(shù)據(jù) 使用完整SQL語言操作數(shù)據(jù)庫 1、添加數(shù)據(jù) ?2、更新數(shù)據(jù) 3、刪除數(shù)據(jù) ?4、查詢數(shù)據(jù) 前面學(xué)習(xí)了創(chuàng)建和升級(jí)數(shù)據(jù)庫,本篇文章主要講解SQLite數(shù)據(jù)庫存儲(chǔ)實(shí)現(xiàn)增刪改查(CRUD)操作。 ??????? 調(diào)用SQLiteOpenHelper的get

    2024年02月04日
    瀏覽(22)
  • MS Access 教程之如何將 MDB 文件轉(zhuǎn)換為 SQLite 數(shù)據(jù)庫

    MS Access 教程之如何將 MDB 文件轉(zhuǎn)換為 SQLite 數(shù)據(jù)庫

    那么如何將 MDB 文件轉(zhuǎn)換為 SQLite 數(shù)據(jù)庫呢?歸根結(jié)底,最簡(jiǎn)單的方法是創(chuàng)建一個(gè) MDB 數(shù)據(jù)庫,即半自動(dòng)轉(zhuǎn)換其他 MDB 文件。我想要一個(gè)類似這樣的面具: 但在此之前,我必須配置 PC。我從下載 SQLite 開始。我可以使用sqlite.org上的預(yù)編譯文件快速完成此操作。對(duì)于 Windows,我下

    2024年02月05日
    瀏覽(14)
  • Unity3D 連接 SQLite 作為數(shù)據(jù)庫基礎(chǔ)功能【詳細(xì)圖文教程】

    Unity3D 連接 SQLite 作為數(shù)據(jù)庫基礎(chǔ)功能【詳細(xì)圖文教程】

    輕量級(jí): SQLite是一個(gè)嵌入式數(shù)據(jù)庫引擎,它的庫文件非常小巧,沒有獨(dú)立的服務(wù)器進(jìn)程,適用于嵌入到其他應(yīng)用程序中,對(duì)于輕量級(jí)的項(xiàng)目或移動(dòng)應(yīng)用程序非常適用。 零配置: 使用SQLite不需要進(jìn)行復(fù)雜的配置或管理,你只需要簡(jiǎn)單地創(chuàng)建一個(gè)文件即可開始使用,減少了額外的

    2024年02月10日
    瀏覽(29)
  • go入門實(shí)踐三-go日志庫-Logrus入門教程

    日志可以用于排查bug。在C++中,我嘗試過:boost log簡(jiǎn)介、spdlog日志庫的封裝使用。但我還是比較喜歡plog,因?yàn)樗?jiǎn)單。 Go 標(biāo)準(zhǔn)庫提供了一個(gè)日志庫log。它的使用可見:Go 每日一庫之 log。但是,它有個(gè)致命的缺點(diǎn),沒有日志等級(jí)。它可以很好的用于日常寫demo,但是不適合稍微

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包