要在GO中使用Sqlite,下面两个包是必须的。
import {
"database/sql"
_"github.com/mattn/go-sqlite3"
}
db,err:=sql.Open(“sqlite3”, dbname)
即可打开数据库,dbname是数据库文件的地址.
//打开数据库
db, err := sql.Open("sqlite3", dbname)
//
//创建表
sqlTable := `
CREATE TABLE IF NOT EXISTS TABLENAME (
"ID" INTEGER PRIMARY KEY AUTOINCREMENT,
"HASHVALUE" BLOB NOT NULL
);`
//执行创建命令
_, err := db.Exec(sqlTable)
//插入数据
func (mydb *MYDB) addToDataBase(hashValue [][]byte){
stmt, err := mydb.db.Prepare("INSERT INTO MYTABLE(HASHVALUE) values(?)")
checkErr(err)
// 显示开启事务,提高插入效率
mydb.db.Exec("BEGIN ")
for _,item:=range hashValue{
//执行插入
_, err := stmt.Exec(item)
checkErr(err)
}
// 提交事务
mmr.db.Exec("COMMIT ")
}
一次性查询不定量的数据。
//查询数据
//一般的查询语句db.Query("SELECT id FROM TABLE WHERE id in (?,?,?)",v1,v2,v3)
//写死了只能查询固定条数据;如果需要查询十几条,几百条,上千条,难不成写一堆查询语句再去选.
//下面的查询语句能够一次性从数据库查询n条数据;
//关键点有两个;
//①构造查询语句的(?,?,?,...,?)至任意长度
//②观察上面的待查询值v1,v2,v3是“散装的”,所以你不能传递一个数组进去;
//slice... 这三个点可以将数组打散,把里面的每一元素提出来
func(mydb *MYDB) MutiQuery(ids[] uint64) map[uint64][]byte {
//ids必须是升序的;因为数据库查询的返回是按序返回的,否则无法对应id和值
var hash []byte
result := make(map[uint64][]byte)
var icount uint64 =0
//构造查询命令
s:="SELECT HASHVALUE FROM TABLE WHERE id in "
s+="("
//这个函数效率高,比单纯+="?,"要快
s+=strings.Repeat("?,", len(ids)-1)
s+="?)"
//ids... 把切片ids拆开;重点
rows,err:=mmr.db.Query(s,ids...)
checkErr(err)
for rows.Next() {
err = rows.Scan(&hash)
checkErr(err)
t := ids[icount]
result[t] = hash
}
return result
}