加载中...

5.3 使用SQLite数据库


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

驱动

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数据库驱动只有第一个,我目前也是采用它来开发项目的。采用标准接口有利于以后出现更好的驱动的时候做迁移。

实例代码

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

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

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

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


还没有评论.