最近在做软路由,需要保存一些设置,一开始打算选择json来保存,但是在开发的过程中发现很多数据之间关联比较多,故打算选择一个数据库来保存。

sql ite3是一个轻型的 嵌入式数据库 引擎,占用资源非常低,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程,所有的操作都来自于程序本身。

Go操作SQLite3数据库

Go操作SQLite3数据库,需要使用github.com/mattn/go-sqlite3这个库,在使用SQLite3创建数据库连接,当我们指定的数据库文件不存在的时候连接对象会自动创建数据库文件;如果数据库文件已近存在,则连接对象不会再创建数据库文件,而是直接打开该数据库文件。

先引入sql与sqlite3库

import (
 " database /sql"
 "fmt"
 _ "github.com/mattn/go-sqlite3"
)
 
打开数据库
var db *sql.DB
func ConnectDB() error {
 var err error
 db, err = sql.Open("sqlite3", "./router.db")
 if err !=  nil  {
 return err
 }
 if err = db.Ping(); err != nil {
 return err
 }
 return nil
}
 

写SQL语句时,不区分大小写,每条语句后需加;结尾。

操作数据库表数据:增删改查
package main
import (
 "database/sql"
 "fmt"
 _ "github.com/mattn/go-sqlite3"
)
func main() {
 db, err := sql.Open("sqlite3", "./foo.db")
 checkErr(err)
 //插入数据
 stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
 checkErr(err)
 res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
 checkErr(err)
 id, err := res.LastInsertId()
 checkErr(err)
 fmt.Println(id)
 //更新数据
 stmt, err = db.Prepare("update userinfo set username=? where uid=?")
 checkErr(err)
 res, err = stmt.Exec("astaxieupdate", id)
 checkErr(err)
  affect , err := res.RowsAffected()
 checkErr(err)
 fmt.Println(affect)
 //查询数据
 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)
 }
 //删除数据
 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)
 db.Close()
}

func checkErr(err error) {
 if err != nil {
 panic(err)
 }
}
 
go-sqlite3编译问题
  • Sqlite3是由C实现的,在GO中编译SQLite3时必须set CGO_ENABLED=1
  • 在UBUNTU下编译需要 apt-get install libsqlite3-dev