golang操作sqlite,使用时要注意锁的问题

比如:查询出某10条数据,然后循环过程中对这10条数据依次进行更新,是不能成功。

        只有循环将处理的结果集存储成map,然后再循环map进行更新。sqlite锁机制

updatedata是我写的,其他是copy的。

其他问题:更新提示返回1,但是查看数据表,数据没有发生变化。

                 答:因为sqlite是本地数据库,拷贝了多份,查看错了

package DbModel

import (
	"database/sql"
	"fmt"
	_ "github.com/mattn/go-sqlite3"
	"log"
	"regexp"
	"strings"
)

const (
	dbDriverName = "sqlite3"
	dbName       = "./SpiderResult_op.db3"
)

type user struct {
	Username string
	Age      int
	Job      string
	Hobby    string
}

type Content struct {
	Id 		int
	Yc      int
	Yf		int
	Title      string
	Cnvd    string
	Cve      string
	Level    string
	Leak_type      string
	Company    string
	Threat_type      string
	Ctime    string
	Utime      string
	Leak_source    string
	Leak_desc      string
	Leak_notice    string
	Affected_entity      string
	Patch    string
	Refer_url      string
	Page_url    string
}

//func Updata() {
//	db, err := gorm.Open(sqlite.Open(dbName), &gorm.Config{})
//	if err != nil {
//		panic("failed to connect database")
//	}
//	var content Content
//	db.Order("id asc").Limit(3).Find(&content)
//	fmt.Println(content)
//}

func UpdateData() {
	db, err := sql.Open(dbDriverName, dbName)
	if checkErr(err) {
		return
	}
	//sql := `select * from Content order by id asc limit 10`
	sql := `select * from Content where id>=200000 order by id asc`
	stmt, err := db.Prepare(sql)
	if err != nil {
		fmt.Println(err)
	}
	rows, err := stmt.Query()
	if err != nil {
		fmt.Println(err)
	}
	defer rows.Close()

	var res map[int]map[string]string
	res = make(map[int]map[string]string)

	for rows.Next() {
		var title, cnvd, cve, level, leak_type, company, threat_type, ctime, utime, leak_source, leak_desc,
		leak_notice, affected_entity, patch, refer_url, page_url string
		var id, yc, yf int

		rows.Scan(&id, &yc, &yf, &title, &cnvd, &cve, &level, &leak_type, &company, &threat_type, &ctime, &utime,
			&leak_source, &leak_desc, &leak_notice, &affected_entity, &patch, &refer_url, &page_url)

		var affected_entity_tmp string
		var patch_tmp string
		var refer_url_tmp string

		//fmt.Println(leak_desc)
		//fmt.Println(affected_entity)
		//fmt.Println(patch)
		//fmt.Println(refer_url)

		if strings.Contains(affected_entity, "ant-empty-description") && strings.Contains(affected_entity, "暂无数据") {
			affected_entity_tmp = "暂无数据"
		} else if strings.Contains(affected_entity, "</td><td>") {
			compileRegex := regexp.MustCompile("</td><td>(.*?)</td></tr>")
			matchArr := compileRegex.FindAllString(affected_entity,-1)
			for _,v := range matchArr {
				tmp  := strings.Replace(v, "</td><td>", "", -1)
				tmp = strings.Replace(tmp, "</td></tr>", "", -1)
				affected_entity_tmp = affected_entity_tmp + tmp + ";"
			}
		}
		//fmt.Println(affected_entity_tmp)

		if strings.Contains(patch, "class=\"default-prefix-link\"") {
			compileRegex := regexp.MustCompile("<a href=\"(.*?)\" class=\"default-prefix-link\">")
			matchArr := compileRegex.FindAllStringSubmatch(patch,-1)
			if len(matchArr) > 0 {
				patch_tmp = matchArr[0][1]
			} else {
				patch_tmp = ""
			}
		}
		//fmt.Println(patch_tmp)


		if strings.Contains(refer_url, "class=\"wordBreak_2tNvp\"") {
			compileRegex := regexp.MustCompile("class=\"wordBreak_2tNvp\">([\\s\\S]*?)</a></td>")
			matchArr := compileRegex.FindAllString(refer_url,-1)
			//fmt.Println(matchArr)
			for _,v := range matchArr {
				tmp  := strings.Replace(v, "class=\"wordBreak_2tNvp\">", "", -1)
				tmp = strings.Replace(tmp, "</a></td>", "", -1)
				tmp = strings.Replace(tmp, " ", "", -1)
				tmp = strings.Replace(tmp, "\n", "", -1)
				refer_url_tmp = refer_url_tmp + tmp + ";"
			}
		}
		//fmt.Println(refer_url_tmp)

		var res2 map[string]string
		res2 = make(map[string]string)

		if affected_entity_tmp != "" {
			res2["affected_entity"] = affected_entity_tmp
			res2["patch"] = patch_tmp
			res2["refer_url"] = refer_url_tmp

			res[id] = res2
		}

	}

	for k,v := range res {

		stmt, err := db.Prepare("update Content set affected_entity=?, patch=?, refer_url=?  where id=?")
		if err != nil {
			fmt.Println(err)
		}
		fmt.Println(k)
		fmt.Println(v["affected_entity"])
		fmt.Println(v["patch"])
		fmt.Println(v["refer_url"])


		res, err := stmt.Exec(v["affected_entity"], v["patch"], v["refer_url"], k)
		if err != nil {
			fmt.Println(err)
		}
		affect, err := res.RowsAffected()
		if err != nil {
			fmt.Println(err)
		}
		fmt.Println(affect)
	}
}

func main() {
	db, err := sql.Open(dbDriverName, dbName)
	if checkErr(err) {
		return
	}
	err = createTable(db)
	if checkErr(err) {
		return
	}
	// err = insertData(db, user{"zhangsan", 28, "engineer", "play football"})
	// if checkErr(err) {
	// 	return
	// }
	res, err := queryData(db, "zhangsan")
	if checkErr(err) {
		return
	}
	fmt.Println(len(res))
	for _, val := range res {
		fmt.Println(val)
	}
	r, err := delByID(db, 1)
	if checkErr(err) {
		return
	}
	if r {
		fmt.Println("delete row success")
	}
}

func createTable(db *sql.DB) error {
	sql := `create table if not exists "users" (
		"id" integer primary key autoincrement,
		"username" text not null,
		"age" integer not null,
		"job" text,
		"hobby" text
	)`
	_, err := db.Exec(sql)
	return err
}

func insertData(db *sql.DB, u user) error {
	sql := `insert into users (username, age, job, hobby) values(?,?,?,?)`
	stmt, err := db.Prepare(sql)
	if err != nil {
		return err
	}
	_, err = stmt.Exec(u.Username, u.Age, u.Job, u.Hobby)
	return err
}

func queryData(db *sql.DB, name string) (l []user, e error) {
	sql := `select * from users`
	stmt, err := db.Prepare(sql)
	if err != nil {
		return nil, err
	}
	rows, err := stmt.Query()
	if err != nil {
		return nil, err
	}
	var result = make([]user, 0)
	for rows.Next() {
		var username, job, hobby string
		var age, id int
		rows.Scan(&id, &username, &age, &job, &hobby)
		result = append(result, user{username, age, job, hobby})
	}
	return result, nil
}



func delByID(db *sql.DB, id int) (bool, error) {
	sql := `delete from users where id=?`
	stmt, err := db.Prepare(sql)
	if err != nil {
		return false, err
	}
	res, err := stmt.Exec(id)
	if err != nil {
		return false, err
	}
	_, err = res.RowsAffected()
	if err != nil {
		return false, err
	}
	return true, nil
}

func checkErr(e error) bool {
	if e != nil {
		log.Fatal(e)
		return true
	}
	return false
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 Golang 操作 SQLite 需要用到第三方库,可以使用 Go 官方推荐的 "database/sql" 包,再结合第三方库 "mattn/go-sqlite3" 进行操作。 以下是一个简单的示例代码,演示如何连接 SQLite 数据库,创建表,插入数据和查询数据: ```go package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./test.db") if err != nil { panic(err) } defer db.Close() // 创建表 _, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)") if err != nil { panic(err) } // 插入数据 stmt, err := db.Prepare("INSERT INTO users(name, age) values(?,?)") if err != nil { panic(err) } defer stmt.Close() _, err = stmt.Exec("Tom", 18) if err != nil { panic(err) } // 查询数据 rows, err := db.Query("SELECT * FROM users") if err != nil { panic(err) } defer rows.Close() for rows.Next() { var id int var name string var age int err = rows.Scan(&id, &name, &age) if err != nil { panic(err) } fmt.Println(id, name, age) } } ``` 在代码中,首先使用 `sql.Open` 函数连接 SQLite 数据库,然后使用 `db.Exec` 函数创建表,使用 `db.Prepare` 函数插入数据,使用 `db.Query` 函数查询数据。最后遍历查询结果,并使用 `rows.Scan` 函数将数据读取到变量中。 需要注意的是,在使用完数据库之后,需要使用 `db.Close` 函数关闭数据库连接。另外,SQLite 数据库文件可以指定路径,如本例中的 "./test.db"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值