在Web開發中,我們經常需要將數據存儲到數據庫中以便進行管理和處理。gosqlite3是一個輕量級的sqlite3驅動,它為Golang提供了快速、穩定的sqlite3支持。在本篇文章中,我們將從以下幾個方面對gosqlite3進行詳細闡述:
1. 安裝gosqlite3
2. 基本使用
3. 數據庫連接及操作
4. 執行事務
5. 並發使用
一、安裝gosqlite3
在進行gosqlite3的使用前,我們需要先進行安裝。
步驟1:安裝sqlite3
sudo apt-get install sqlite3步驟2:安裝gosqlite3
go get github.com/mattn/go-sqlite3安裝完成後,我們就可以開始使用gosqlite3進行開發了。
二、基本使用
下面是一個簡單的例子,演示了如何使用gosqlite3進行數據庫的連接和操作:
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()
sqlStmt := `
create table foo (id integer not null primary key, name text);
delete from foo;
`
_, err = db.Exec(sqlStmt)
if err != nil {
log.Printf("%q: %s\n", err, sqlStmt)
return
}
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
for i := 0; i < 100; i++ {
_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
if err != nil {
log.Fatal(err)
}
}
tx.Commit()
rows, err := db.Query("select id, name from foo")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
這段代碼首先創建了一個名為test.db的sqlite3數據庫。然後,它創建了一個名為foo的表,插入了100條記錄並輸出了表中的所以記錄。在這個例子中,我們看到了gosqlite3的基本數據類型支持和如何執行SQL語句。
三、數據庫連接及操作
對於一個應用程序來說,連接數據庫是一個非常關鍵的步驟。在gosqlite3中,我們可以使用Open方法來連接數據庫。數據庫連接器會在使用完畢後自動關閉。此外,在進行查詢或修改時,還需要使用Transaction。下面的代碼演示了如何進行數據庫查詢和修改:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, _ := sql.Open("sqlite3", "./test.db")
defer db.Close()
// 查詢數據
rows, _ := db.Query("select id, name from people")
defer rows.Close()
for rows.Next() {
var id int
var name string
rows.Scan(&id, &name)
fmt.Printf("id=%d, name='%s'\n", id, name)
}
// 插入數據
stmt, _ := db.Prepare("insert into people(name) values(?)")
defer stmt.Close()
res, _ := stmt.Exec("Tom")
id, _ := res.LastInsertId()
fmt.Printf("ID of inserted row is %d\n", id)
// 刪除數據
stmt, _ = db.Prepare("delete from people where name=?")
defer stmt.Close()
res, _ = stmt.Exec("Tom")
num, _ := res.RowsAffected()
fmt.Printf("%d row(s) deleted\n", num)
}
四、執行事務
在gosqlite3中執行事務非常簡單。通過調用Begin方法,我們可以開啟一個事務。在事務中,執行的所有SQL語句都將作為一個整體來進行提交或回滾。下面的代碼演示了如何使用事務:
package main
import (
"database/sql"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, _ := sql.Open("sqlite3", "./test.db")
defer db.Close()
tx, _ := db.Begin()
stmt, _ := tx.Prepare("insert into people(name) values(?)")
defer stmt.Close()
for i := 0; i < 10; i++ {
_, err := stmt.Exec(fmt.Sprintf("user-%d", i))
if err != nil {
log.Fatal(err)
}
}
tx.Commit()
rows, _ := db.Query("select id, name from people")
defer rows.Close()
for rows.Next() {
var id int
var name string
rows.Scan(&id, &name)
log.Println(id, name)
}
}
五、並發使用
在Web應用中,我們經常需要在多個Goroutine中同時進行數據庫操作。gosqlite3的設計支持並發使用。但是,需要注意的是:不要在多個線程中共享同一個*sql.DB對象,否則會導致不可預期的問題。下面的代碼演示了如何在多個Goroutine中同時使用gosqlite3:
package main
import (
"database/sql"
"fmt"
"log"
"sync"
_ "github.com/mattn/go-sqlite3"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
db, _ := sql.Open("sqlite3", "./test.db")
tx, _ := db.Begin()
stmt, _ := tx.Prepare("insert into people(name) values(?)")
for i := 0; i < 10; i++ {
stmt.Exec(fmt.Sprintf("user-%d-%d", id, i))
}
stmt.Close()
tx.Commit()
rows, _ := db.Query("select count(*) from people")
defer rows.Close()
var count int
rows.Next()
rows.Scan(&count)
log.Printf("worker%d count=%d", id, count)
db.Close()
}
func main() {
db, _ := sql.Open("sqlite3", "./test.db")
db.Exec("create table if not exists people(id integer primary key, name text)")
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
}
在這個例子中,我們分別創建了10個Goroutine去並發地插入數據到表people中。在主函數中,我們使用sync.WaitGroup來等待所有的Goroutine執行完畢。最後,我們查詢表people中的記錄數並輸出。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/196419.html
微信掃一掃
支付寶掃一掃