05.3.md 3.3 KB
Newer Older
J
James Miranda 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# 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:

	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程序是如何操作数据库表数据:增删改查
V
vCaesar 已提交
32
```Go
J
James Miranda 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

	package main

	import (
		"database/sql"
		"fmt"
		"time"
		_ "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 time.Time
			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)
		}
	}
V
vCaesar 已提交
108
```
J
James Miranda 已提交
109 110 111 112 113 114 115 116 117 118 119 120

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


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

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

## links
   * [目录](<preface.md>)
   * 上一节: [使用MySQL数据库](<05.2.md>)
   * 下一节: [使用PostgreSQL数据库](<05.4.md>)