目录
一、SQLite3安装(linux)
SQLite是开源的嵌入式关系型数据库,实现自包容、零配置、支持事务的SQL数据库引擎。
有高度便携、使用方便、结构紧凑、高效、可靠等特点。
与其他数据库(比如Mysql)不同,SQLite安装与运行都很简单,确保SQLite的二进制文件存在就可以创建、连接和使用数据库。其安装方式有以下:
- 联网直接安装,sudo apt-get install sqlite3
- 离线安装
- docker镜像安装
1.2 在线安装
开始安装
sudo apt-get install sqlite3
目录下创建db
sqlite3 /home/zhongqiu/golang_test.db
执行表创建语句
create table userinfo( id INTEGER PRIMARY KEY AUTOINCREMENT,username VARCHAR(64) NULL,departname VARCHAR(64) NULL,created DATE NULL);
二、方案选型
SQLite是绝对值得考虑的嵌入式数据库项目,是开源版的Access。
Go语言支持SQLite的驱动比较多,但是很多都不支持database/sql接口:
- GitHub - mattn/go-sqlite3: sqlite3 driver for go using database/sqlsqlite3 driver for go using database/sql. Contribute to mattn/go-sqlite3 development by creating an account on GitHub.https://github.com/mattn/go-sqlite3 支持database/sql接口,基于cgo(请自行百度cgo)
- https://github.com/feyeleanor/gosqlite3https://github.com/feyeleanor/gosqlite3 不支持database/sql接口,基于cgo
- https://github.com/phf/go-sqlite3https://github.com/phf/go-sqlite3 不支持database/sql接口,基于cgo
目前支持database/sql的SQLite数据库驱动较少,采用标准接口有利于迁移。本文用第一个驱动。
三、编写代码
3.1 代码运行环境准备
Go语言环境
确保Linux环境有go语言运行环境,因为会在linux运行Golang代码。(不想在windows上安装SQLite3)。
SQLite3生成db
如下图,db生成目录:
3.2 操作SQLite3 增删改查代码
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
type UserInfo struct {
id int64
username string
departname string
created string
}
func main() {
// 注意这里生成的db数据库路径一定要对上
db, err := sql.Open("sqlite3", "/home/zhongqiu/golang_test.db")
checkErr(err)
// 插入数据
id := insertUser(db)
// 更新用户数据
updateUser(db, id)
// 查询用户
queryUser(db)
// 删除用户
deleteUser(db, id)
db.Close()
}
// 插入用户数据
func insertUser(db *sql.DB) (id int64) {
stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) values(?,?,?)")
checkErr(err)
res, err := stmt.Exec("王五", "产品部", "2000-10-10")
checkErr(err)
id, err = res.LastInsertId()
checkErr(err)
fmt.Println("插入后 返回", id)
return id
}
// 更新用户数据
func updateUser(db *sql.DB, id int64) {
stmt, err := db.Prepare("update userinfo set username =? where id =?")
checkErr(err)
res, err := stmt.Exec("王五改", id)
checkErr(err)
affected, err := res.RowsAffected()
checkErr(err)
fmt.Println("更新后的行数", affected)
}
// 查询用户
func queryUser(db *sql.DB) {
rows, err := db.Query("SELECT * FROM userinfo")
checkErr(err)
userInfo := UserInfo{}
for rows.Next() {
err := rows.Scan(&userInfo.id, &userInfo.username, &userInfo.departname, &userInfo.created)
checkErr(err)
fmt.Println("userinfo 查询", userInfo)
}
}
// 删除用户
func deleteUser(db *sql.DB, id int64) {
stmt, err := db.Prepare("delete from userinfo where id =?")
checkErr(err)
res, err := stmt.Exec(id)
checkErr(err)
affected, err := res.RowsAffected()
checkErr(err)
fmt.Println("删除作用", affected)
}
// 检查错误
func checkErr(err error) {
if err != nil {
panic(err)
}
}
3.3 验证结果
PS:
- 运行时候 github.com/mattn/go-sqlite3 不一定拉取下来,可以尝试切换源。
- 不用Conn时,可以尝试关闭。
- 可以看出采用了database/sql时,与该系列课程中的mysql操作流程几乎完全一致,只是在sql.Open时采用了SQLite的独有方式(部署服务能访问到的文件夹路径)。