如何使用Go操作SQLite
一、驅(qū)動(dòng)選擇
Go語(yǔ)言通過標(biāo)準(zhǔn)庫(kù)database/sql結(jié)合第三方驅(qū)動(dòng)可以方便地操作SQLite數(shù)據(jù)庫(kù)。Go語(yǔ)言支持SQLite的驅(qū)動(dòng)較多,但推薦使用支持database/sql接口的驅(qū)動(dòng),例如github.com/mattn/go-sqlite3。該驅(qū)動(dòng)功能完善,兼容性強(qiáng),是Go語(yǔ)言操作SQLite的主流選擇。
官方文檔:https://mattn.github.io/go-sqlite3/
二、數(shù)據(jù)庫(kù)連接
2.1 安裝驅(qū)動(dòng)
首先,通過以下命令安裝go-sqlite3驅(qū)動(dòng):
go get github.com/mattn/go-sqlite3
2.2 連接數(shù)據(jù)庫(kù)
以下代碼展示了如何連接SQLite數(shù)據(jù)庫(kù):
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// 打開數(shù)據(jù)庫(kù)連接,如果數(shù)據(jù)庫(kù)不存在會(huì)自動(dòng)創(chuàng)建
db, err := sql.Open("sqlite3", "./test.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 檢查連接是否成功
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("成功連接到SQLite數(shù)據(jù)庫(kù)")
}三、表操作
3.1 創(chuàng)建表
以下代碼展示了如何創(chuàng)建一個(gè)用戶表:
func createTable(db *sql.DB) {
query := `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);`
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
fmt.Println("表創(chuàng)建成功或已存在")
}3.2 刪除表
如果需要?jiǎng)h除表,可以使用以下代碼:
func dropTable(db *sql.DB) {
query := "DROP TABLE IF EXISTS users;"
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
fmt.Println("表刪除成功")
}四、增刪改查操作
4.1 插入數(shù)據(jù)
以下代碼展示了如何向用戶表中插入數(shù)據(jù):
func insertUser(db *sql.DB, name string, age int) {
query := "INSERT INTO users (name, age) VALUES (?, ?);"
result, err := db.Exec(query, name, age)
if err != nil {
log.Fatal(err)
}
id, _ := result.LastInsertId()
fmt.Printf("插入成功,用戶ID: %d\n", id)
}4.2 查詢數(shù)據(jù)
以下代碼展示了如何查詢用戶表中的數(shù)據(jù):
func queryUsers(db *sql.DB) {
query := "SELECT id, name, age FROM users;"
rows, err := db.Query(query)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
fmt.Println("用戶列表:")
for rows.Next() {
var id int
var name string
var age int
err := rows.Scan(&id, &name, &age)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, 姓名: %s, 年齡: %d\n", id, name, age)
}
}4.3 更新數(shù)據(jù)
以下代碼展示了如何更新用戶表中的數(shù)據(jù):
func updateUser(db *sql.DB, id int, newName string, newAge int) {
query := "UPDATE users SET name = ?, age = ? WHERE id = ?;"
result, err := db.Exec(query, newName, newAge, id)
if err != nil {
log.Fatal(err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("更新成功,影響行數(shù): %d\n", rowsAffected)
}4.4刪除數(shù)據(jù)
以下代碼展示了如何刪除用戶表中的數(shù)據(jù):
func deleteUser(db *sql.DB, id int) {
query := "DELETE FROM users WHERE id = ?;"
result, err := db.Exec(query, id)
if err != nil {
log.Fatal(err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("刪除成功,影響行數(shù): %d\n", rowsAffected)
}五、完整案例
以下是一個(gè)完整的示例,包含上述所有操作:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, err := sql.Open("sqlite3", "./test.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("成功連接到SQLite數(shù)據(jù)庫(kù)")
createTable(db)
insertUser(db, "張三", 25)
insertUser(db, "李四", 30)
queryUsers(db)
updateUser(db, 1, "張三改", 26)
queryUsers(db)
deleteUser(db, 2)
queryUsers(db)
}
func createTable(db *sql.DB) {
query := `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);`
_, err := db.Exec(query)
if err != nil {
log.Fatal(err)
}
fmt.Println("表創(chuàng)建成功或已存在")
}
func insertUser(db *sql.DB, name string, age int) {
query := "INSERT INTO users (name, age) VALUES (?, ?);"
result, err := db.Exec(query, name, age)
if err != nil {
log.Fatal(err)
}
id, _ := result.LastInsertId()
fmt.Printf("插入成功,用戶ID: %d\n", id)
}
func queryUsers(db *sql.DB) {
query := "SELECT id, name, age FROM users;"
rows, err := db.Query(query)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
fmt.Println("用戶列表:")
for rows.Next() {
var id int
var name string
var age int
err := rows.Scan(&id, &name, &age)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, 姓名: %s, 年齡: %d\n", id, name, age)
}
}
func updateUser(db *sql.DB, id int, newName string, newAge int) {
query := "UPDATE users SET name = ?, age = ? WHERE id = ?;"
result, err := db.Exec(query, newName, newAge, id)
if err != nil {
log.Fatal(err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("更新成功,影響行數(shù): %d\n", rowsAffected)
}
func deleteUser(db *sql.DB, id int) {
query := "DELETE FROM users WHERE id = ?;"
result, err := db.Exec(query, id)
if err != nil {
log.Fatal(err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("刪除成功,影響行數(shù): %d\n", rowsAffected)
}總結(jié):Go語(yǔ)言通過database/sql和go-sqlite3驅(qū)動(dòng)可以高效地操作SQLite數(shù)據(jù)庫(kù)。上述代碼涵蓋了數(shù)據(jù)庫(kù)連接、表操作以及增刪改查的完整流程,適合作為學(xué)習(xí)Go語(yǔ)言操作SQLite的基礎(chǔ)案例。
到此這篇關(guān)于如何使用Go操作SQLite的文章就介紹到這了,更多相關(guān)go 操作sqlite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言中讀取命令參數(shù)的幾種方法總結(jié)
部署golang項(xiàng)目時(shí)難免要通過命令行來設(shè)置一些參數(shù),那么在golang中如何操作命令行參數(shù)呢?那么下面這篇文章就來給大家介紹了關(guān)于Go語(yǔ)言中讀取命令參數(shù)的幾種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-11-11
解決Golang中g(shù)oroutine執(zhí)行速度的問題
這篇文章主要介紹了解決Golang中g(shù)oroutine執(zhí)行速度的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05
golang post請(qǐng)求常用的幾種方式小結(jié)
這篇文章主要介紹了golang post請(qǐng)求常用的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Golang 使用Map實(shí)現(xiàn)去重與set的功能操作
這篇文章主要介紹了Golang 使用 Map 實(shí)現(xiàn)去重與 set 的功能操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
如何將Golang數(shù)組slice轉(zhuǎn)為逗號(hào)分隔的string字符串
這篇文章主要介紹了如何將Golang數(shù)組slice轉(zhuǎn)為逗號(hào)分隔的string字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Go語(yǔ)言TCP從原理到代碼實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Go語(yǔ)言TCP從原理到代碼實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
從并發(fā)到并行解析Go語(yǔ)言中的sync.WaitGroup
Go?語(yǔ)言提供了許多工具和機(jī)制來實(shí)現(xiàn)并發(fā)編程,其中之一就是?sync.WaitGroup。本文就來深入討論?sync.WaitGroup,探索其工作原理和在實(shí)際應(yīng)用中的使用方法吧2023-05-05
RabbitMQ延時(shí)消息隊(duì)列在golang中的使用詳解
延時(shí)隊(duì)列常使用在某些業(yè)務(wù)場(chǎng)景,使用延時(shí)隊(duì)列可以簡(jiǎn)化系統(tǒng)的設(shè)計(jì)和開發(fā)、提高系統(tǒng)的可靠性和可用性、提高系統(tǒng)的性能,下面我們就來看看如何在golang中使用RabbitMQ的延時(shí)消息隊(duì)列吧2023-11-11

