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)管理。