標籤:
Go語言中使用SQLite資料庫
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 mainimport ( "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的方式開啟。
Go語言中使用SQLite資料庫