Go DB3. 使用SQLite數(shù)據(jù)庫

SQLite 是一個開源的嵌入式關(guān)系數(shù)據(jù)庫,實現(xiàn)自包容、零配置、支持事務的SQL數(shù)據(jù)庫引擎。其特點是高度便攜、使用方便、結(jié)構(gòu)緊湊、高效、可靠。

與其他數(shù)據(jù)庫管理系統(tǒng)不同,SQLite的安裝和運行非常簡單,在大多數(shù)情況下,只要確保SQLite的二進制文件存在即可開始創(chuàng)建、連接和使用數(shù)據(jù)庫。如果您正在尋找一個嵌入式數(shù)據(jù)庫項目或解決方案,SQLite是絕對值得考慮。

SQLite驅(qū)動

Go支持sqlite的驅(qū)動也比較多,但是好多都是不支持database/sql接口的(推薦)

* https://github.com/mattn/go-sqlite3 支持database/sql接口,基于cgo寫的

* https://github.com/feyeleanor/gosqlite3 不支持database/sql接口,基于cgo寫的

* https://github.com/phf/go-sqlite3 不支持database/sql接口,基于cgo寫的

目前支持database/sql的SQLite數(shù)據(jù)庫驅(qū)動只有第一個,推薦使用。采用標準接口有利于以后出現(xiàn)更好的驅(qū)動的時候做遷移。

示例代碼

1、示例的數(shù)據(jù)庫表結(jié)構(gòu)如下所示,相應的建表SQL:

CREATE TABLE `userinfo` (

????`uid` INTEGER PRIMARY KEY AUTOINCREMENT,

????`username` VARCHAR(64) NULL,

????`department` VARCHAR(64) NULL,

????`created` DATE NULL

);

CREATE TABLE `userdetail` (

????`uid` INT(10) NULL,

????`intro` TEXT NULL,

????`profile` TEXT NULL,

????PRIMARY KEY (`uid`)

);

2、使用database/sql接口對數(shù)據(jù)庫表進行增刪改查操作:

package main

import (

????"database/sql"

????"fmt"

????_ "github.com/mattn/go-sqlite3"

)

func main() {

????// 連接數(shù)據(jù)庫

????db, err := sql.Open("sqlite3", "./foo.db")

????checkErr(err)

????defer db.Close()

????// 插入數(shù)據(jù)

????stmt, err := db.Prepare("INSERT INTO userinfo(username, department, created) values(?,?,?)")

????checkErr(err)

????res, err := stmt.Exec("lai", "rm", "2018-01-01")

????checkErr(err)

????// 最新記錄ID

????id, err := res.LastInsertId()

????checkErr(err)

????fmt.Println(id)

????// 更新數(shù)據(jù)

????stmt, err = db.Prepare("UPDATE userinfo SET username=? WHERE uid=?")

????checkErr(err)

????res, err = stmt.Exec("laiupdate", id)

????checkErr(err)

????affect, err := res.RowsAffected()

????checkErr(err)

????fmt.Println(affect)

????// 查詢數(shù)據(jù)

????rows, err := db.Query("SELECT * FROM userinfo")

????checkErr(err)

????for rows.Next() {

????????var uid int

????????var username string

????????var department string

????????var created string

????????err = rows.Scan(&uid, &username, &department, &created)

????????checkErr(err)

????????fmt.Println(uid)

????????fmt.Println(username)

????????fmt.Println(department)

????????fmt.Println(created)

????}

????// 刪除數(shù)據(jù)

????stmt, err = db.Prepare("DELETE FROM userinfo WHERE uid=?")

????checkErr(err)

????res, err = stmt.Exec(id)

????checkErr(err)

????affect, err = res.RowsAffected()

????checkErr(err)

????fmt.Println(affect)

}

func checkErr(err error) {

????if err != nil {

????????panic(err)

????}

}

對比MySQL數(shù)據(jù)庫的操作,唯一改變的就是導入的驅(qū)動改變了,然后調(diào)用sql.Open是采用了SQLite的方式打開。

管理工具

sqlite管理工具:http://sqliteadmin.orbmu2k.de/

可以方便的執(zhí)行數(shù)據(jù)庫的相關(guān)管理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容