1、驅動
Go支持sqlite的驅動也比較多,但是好多都是不支持database/sql接口的
- https://github.com/mattn/go-sqlite3 支持database/sql接口,基於cgo(關於cgo的知識請參看官方文檔或者本書后面的章節)寫的
- https://github.com/feyeleanor/gosqlite3 不支持database/sql接口,基於cgo寫的
- https://github.com/phf/go-sqlite3 不支持database/sql接口,基於cgo寫的
目前支持database/sql的SQLite數據庫驅動只有第一個,我目前也是采用它來開發項目的。采用標准接口有利於以后出現更好的驅動的時候做遷移。
2、實例代碼
示例的數據庫表結構如下所示,相應的建表SQL:
CREATE TABLE `userinfo` ( `uid` INTEGER PRIMARY KEY AUTOINCREMENT, `username` VARCHAR(64) NULL, `departname` VARCHAR(64) NULL, `created` DATE NULL ); CREATE TABLE `userdeatail` ( `uid` INT(10) NULL, `intro` TEXT NULL, `profile` TEXT NULL, PRIMARY KEY (`uid`) );
看下面Go程序是如何操作數據庫表數據:增刪改查
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) } }
我們可以看到上面的代碼和MySQL例子里面的代碼幾乎是一模一樣的,唯一改變的就是導入的驅動改變了,然后調用sql.Open
是采用了SQLite的方式打開。