5.3 使用SQLite数据库

SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。SQLite可以是说开源的Access。

驱动

Go支持sqlite的驱动也比较多,但是好多都是不支持database/sql接口的

目前支持database/sql的SQLite数据库驱动只有第一个,我目前也是采用它来开发项目的。采用标准接口有利于以后出现更好的驱动的时候做迁移。

实例代码

示例的数据库表结构如下所示,相应的建表SQL:

  1. CREATE TABLE `userinfo` (
  2. `uid` INTEGER PRIMARY KEY AUTOINCREMENT,
  3. `username` VARCHAR(64) NULL,
  4. `departname` VARCHAR(64) NULL,
  5. `created` DATE NULL
  6. );
  7. CREATE TABLE `userdetail` (
  8. `uid` INT(10) NULL,
  9. `intro` TEXT NULL,
  10. `profile` TEXT NULL,
  11. PRIMARY KEY (`uid`)
  12. );

看下面Go程序是如何操作数据库表数据:增删改查

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "time"
  6. _ "github.com/mattn/go-sqlite3"
  7. )
  8. func main() {
  9. db, err := sql.Open("sqlite3", "./foo.db")
  10. checkErr(err)
  11. //插入数据
  12. stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
  13. checkErr(err)
  14. res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
  15. checkErr(err)
  16. id, err := res.LastInsertId()
  17. checkErr(err)
  18. fmt.Println(id)
  19. //更新数据
  20. stmt, err = db.Prepare("update userinfo set username=? where uid=?")
  21. checkErr(err)
  22. res, err = stmt.Exec("astaxieupdate", id)
  23. checkErr(err)
  24. affect, err := res.RowsAffected()
  25. checkErr(err)
  26. fmt.Println(affect)
  27. //查询数据
  28. rows, err := db.Query("SELECT * FROM userinfo")
  29. checkErr(err)
  30. for rows.Next() {
  31. var uid int
  32. var username string
  33. var department string
  34. var created time.Time
  35. err = rows.Scan(&uid, &username, &department, &created)
  36. checkErr(err)
  37. fmt.Println(uid)
  38. fmt.Println(username)
  39. fmt.Println(department)
  40. fmt.Println(created)
  41. }
  42. //删除数据
  43. stmt, err = db.Prepare("delete from userinfo where uid=?")
  44. checkErr(err)
  45. res, err = stmt.Exec(id)
  46. checkErr(err)
  47. affect, err = res.RowsAffected()
  48. checkErr(err)
  49. fmt.Println(affect)
  50. db.Close()
  51. }
  52. func checkErr(err error) {
  53. if err != nil {
  54. panic(err)
  55. }
  56. }

我们可以看到上面的代码和MySQL例子里面的代码几乎是一模一样的,唯一改变的就是导入的驱动改变了,然后调用sql.Open是采用了SQLite的方式打开。

sqlite管理工具:http://sqliteadmin.orbmu2k.de/

可以方便的新建数据库管理。