一屡拨、前言
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ù)庫秉氧。
二、使用
Go 支持 sqlite 的庫也比較多蜒秤,下面介紹github.com/mattn/go-sqlite3庫來對(duì)SQLite3數(shù)庫存
- mattn/go-sqlite3基于cgo汁咏,Windows中cgo環(huán)境安裝
1. 引用庫
需要引用sqlite3時(shí)前面加個(gè)_
,不然會(huì)編譯出錯(cuò)作媚。語法基本上和MySQL類似
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
2. 打開/創(chuàng)建數(shù)據(jù)庫
在當(dāng)前目錄打開my.db數(shù)據(jù)庫攘滩,如果不存在,則創(chuàng)建一個(gè)
// 打開/創(chuàng)建
db, err := sql.Open("sqlite3", "./my.db")
// 關(guān)閉
db.Close()
3. 創(chuàng)建表
table := `
CREATE TABLE IF NOT EXISTS user (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(128) NULL,
created DATE NULL
);
`
_, err = db.Exec(table)
- 創(chuàng)建一個(gè)user表纸泡,
- 表中有一個(gè)自增長的uid轰驳,
- 一個(gè)128位字符串的name
- 日期類型的創(chuàng)建時(shí)間
4. 插入數(shù)據(jù)
stmt, err := db.Prepare("INSERT INTO user(name, created) values(?,?)")
if err != nil {
panic(err)
}
// res 為返回結(jié)果
res, err := stmt.Exec("guoke", "2012-12-09")
if err != nil {
panic(err)
}
// 可以通過res取自動(dòng)生成的id
id, err := res.LastInsertId()
if err != nil {
panic(err)
}
5. 刪除數(shù)據(jù)
stmt, err = db.Prepare("delete from user where uid=?")
if err != nil {
panic(err)
}
res, err = stmt.Exec(id)
if err != nil {
panic(err)
}
6. 更新數(shù)據(jù)
stmt, err := db.Prepare("update %s set name=? where uid=?")
if stmt == nil || err != nil {
panic(err)
}
_, err = stmt.Exec("guoke3915", 1)
if err != nil {
panic(err)
}
7.查詢數(shù)據(jù)
rows, err := db.Query("SELECT * FROM user")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var uid int
var name string
var created time.Time
err = rows.Scan(&uid, &name, &created)
if err != nil {
panic(err)
}
fmt.Println(uid)
fmt.Println(name)
fmt.Println(created)
}