SQLite 是一個(gè)開源的嵌入式關(guān)系數(shù)據(jù)庫两波,實(shí)現(xiàn)自包容瞳步、零配置、支持事務(wù)的SQL數(shù)據(jù)庫引擎腰奋。其特點(diǎn)是高度便攜单起、使用方便、結(jié)構(gòu)緊湊氛堕、高效馏臭、可靠野蝇。
與其他數(shù)據(jù)庫管理系統(tǒng)不同讼稚,SQLite的安裝和運(yùn)行非常簡(jiǎn)單,在大多數(shù)情況下,只要確保SQLite的二進(jìn)制文件存在即可開始創(chuàng)建绕沈、連接和使用數(shù)據(jù)庫锐想。如果您正在尋找一個(gè)嵌入式數(shù)據(jù)庫項(xiàng)目或解決方案,SQLite是絕對(duì)值得考慮乍狐。
SQLite驅(qū)動(dòng)
Go支持sqlite的驅(qū)動(dòng)也比較多赠摇,但是好多都是不支持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ū)動(dòng)只有第一個(gè)烫罩,推薦使用。采用標(biāo)準(zhǔn)接口有利于以后出現(xiàn)更好的驅(qū)動(dòng)的時(shí)候做遷移洽故。
示例代碼
1贝攒、示例的數(shù)據(jù)庫表結(jié)構(gòu)如下所示,相應(yīng)的建表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接口對(duì)數(shù)據(jù)庫表進(jìn)行增刪改查操作:
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)
????}
}
對(duì)比MySQL數(shù)據(jù)庫的操作隘弊,唯一改變的就是導(dǎo)入的驅(qū)動(dòng)改變了,然后調(diào)用sql.Open是采用了SQLite的方式打開荒适。
管理工具
sqlite管理工具:http://sqliteadmin.orbmu2k.de/
可以方便的執(zhí)行數(shù)據(jù)庫的相關(guān)管理梨熙。