go中使用sqlite

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go中使用sqlite相关的知识,希望对你有一定的参考价值。

1 安装mingw64

1.1 下载mingw

sqlite作为一个快速开发的数据库,理应被go支持,但是要在go里面使用sqlite,实际上是要下载sqlite的源代码编译的,当然,使用的时候不用手动编译,在linux中,gcc如果已经安装了,是不用担心的,但是在windows中,为了支持编译,必须使用mingw64

mingw64下载

注意在mingw64安装过程中选择x64。

1.2 path路径设置

注意在windows中必须在path路径中增加mingw64的bin目录,以便于让gcc能够找到。


2 使用sqlite

2.1 创建表

在程序执行开头创建数据表
db, err := sql.Open(“sqlite3”, “./data.db”)
defer db.Close()
checkErr(err)
db.Exec(sql_table) //执行数据表
为了查询的效率,一般在需要索引的地方加上索引,必须这次的数据中,我们给Deviceid 加上了索引

CREATE INDEX deviceid_idx ON file_hash_list (deviceid);

2.2 创建数据结构

type Data0 struct 
	id        int
	Deviceid  string
	Sdnn      int
	Average   int
	Rmssd     int
	Pnn50     float32
	Timestart string

2.3 增删改查 adus

add delete update select 封装
将需要的业务封装,写成多个函数,具体看下面的代码

2.4 show me the code

复制可以用

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/mattn/go-sqlite3"
)

var sql_table = `CREATE TABLE if not exists "data_1" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "deviceid" VARCHAR(64) NULL,
    "sdnn" INTEGER,
	"average" INTEGER,
    "rmssd" INTEGER,
	"pnn50" float,
    "timestart" TIMESTAMP default (datetime('now', 'localtime'))
);
CREATE INDEX deviceid_idx ON file_hash_list (deviceid);
`

type Data0 struct 
	id        int
	Deviceid  string
	Sdnn      int
	Average   int
	Rmssd     int
	Pnn50     float32
	Timestart string


func checkErr(err error) 
	if err != nil 
		panic(err)
	


func insert(db *sql.DB, did string, ssdn int, average int, rmssd int, pnn50 float32, timestart string) int64 
	stmt, err := db.Prepare("INSERT INTO data_1(deviceid, sdnn,average,rmssd,pnn50,timestart) values(?,?,?,?,?,?)")
	checkErr(err)

	res, err := stmt.Exec(did, ssdn, average, rmssd, pnn50, timestart)
	checkErr(err)

	id, err := res.LastInsertId()
	checkErr(err)

	return id


func update_average(db *sql.DB, deviceid string, average int) int64 

	stmt, err := db.Prepare("update data_1 set deviceid=? where deviceid=?")
	checkErr(err)

	res, err := stmt.Exec(average, deviceid)
	checkErr(err)

	affect, err := res.RowsAffected()
	checkErr(err)
	return affect


func select_all(db *sql.DB, data0 *Data0) 
	rows, err := db.Query("SELECT * FROM data_1")

	checkErr(err)

	for rows.Next() 
		err = rows.Scan(&data0.id, &data0.Deviceid, &data0.Sdnn, &data0.Average,
			&data0.Rmssd, &data0.Pnn50, &data0.Timestart)
		checkErr(err)
	


func delete_data(db *sql.DB, id int) int64 
	stmt, err := db.Prepare("delete from data_1 where id=?")
	checkErr(err)

	res, err1 := stmt.Exec(id)
	checkErr(err1)

	affect, err2 := res.RowsAffected()
	checkErr(err2)

	return affect


func main() 

	db, err := sql.Open("sqlite3", "./data.db")
	defer db.Close()
	checkErr(err)
	db.Exec(sql_table) //执行数据表
	id := insert(db, "qianbo", 15, 70, 20, 0.2, "2021-01-09 07:05:22")
	fmt.Println("insert:", id)
	id = insert(db, "guanzhi", 16, 71, 25, 0.3, "2021-12-09 07:05:22")
	fmt.Println("insert:", id)
	affected := update_average(db, "qianbo", 67)
	fmt.Println("update:", affected)

	var data0 Data0
	select_all(db, &data0)
	fmt.Println(id, data0.Deviceid)

	db.Close()


以上是关于go中使用sqlite的主要内容,如果未能解决你的问题,请参考以下文章

Go & SQLite on Windows

如何使用github.com/mattn/go-sqlite3对Google Cloud VM交叉编译Go软件包?

SQLite3 极简教程 & Go 使用 SQLite 内存模式操作数据结构

go iris xorm包使用(sqlite3数据库增删查改)

Go 安装 sqlite3驱动报错

Beego+go-sqlite3 Arm平台移植遇到的问题