• 5.3 使用SQLite数据库
    • 驱动
    • 实例代码
    • links

    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 `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/

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

    • 目录
    • 上一节: 使用MySQL数据库
    • 下一节: 使用PostgreSQL数据库