解决sqlite3 gcc:exec: "gcc": executable file not found in %PATH%Windows 如果使用 Go 语言使用 sqlite3 时,需要gcd来编译sqlite3模块相关c代码 。
解决方法:安装tdm64-gcc-9.2.0.exe, https://jmeubank.github.io/tdm-gcc/download/
数据库处理逻辑 sq3_vue包sq3_init.goinit() 初始化函数获取main执行目录,并按操作系统连接文件位置,读取文件 。
package sq3_vueimport ( "database/sql" "os" "path" _ "github.com/mattn/go-sqlite3")var db *sql.DBfunc init() { p, err := os.Getwd() checkError(err) db, err = sql.Open("sqlite3", path.Join(p, "data/data.db")) checkError(err)}func checkError(err error) { if err != nil {panic(err) }}
sq3_comment.go为具体的数据库处理逻辑,插入返回comment的json字节切片 {}
,查询返回comment数组的json字节切片 [{},{},{}]
。
*sql.DB 是Go标准库规定的接口,方便操作 。
stmt、rows 需要 defer close()
package sq3_vueimport ( "encoding/json" "fmt" "time")type Comment struct { IDint`json:"id"` UIDint`json:"uid"` Name string `json:"name"` Text string `json:"text"` Pidint`json:"pid"` Date int64`json:"date"`}const insertStmt = `INSERT INTO comments(uid,text,pid,date) values(?,?,?,?)`const lastedStmt = `select id,uid,text,pid,date,name from comments join users using(uid) where id = ?`func (Comment) InsertComment(uid, pid int64, text string) (json_ []byte, err error) { stmt, err := db.Prepare(insertStmt) checkError(err) defer stmt.Close() res, err := stmt.Exec(uid, text, pid, time.Now().UnixMilli()) checkError(err) n, err := res.RowsAffected() checkError(err) if n == 0 {return nil, fmt.Errorf("插入失败") } n, err = res.LastInsertId() checkError(err) stmt, err = db.Prepare(lastedStmt) checkError(err) defer stmt.Close() rows, err := stmt.Query(n) checkError(err) defer rows.Close() rows.Next() var c Comment rows.Scan(&c.ID, &c.UID, &c.Text, &c.Pid, &c.Date, &c.Name) checkError(err) json_, err = json.Marshal(c) checkError(err) return json_, nil}const deleteStmt = `delete from comments where id = ?`func (Comment) DeleteComment(id int64) error { stmt, err := db.Prepare(deleteStmt) checkError(err) defer stmt.Close() res, err := stmt.Exec(id) checkError(err) n, err := res.RowsAffected() checkError(err) if n == 0 {return fmt.Errorf("删除失败") } return nil}const queryStmt = `select id,uid,text,pid,date,name from comments join users using(uid) where pid = ?`func (Comment) QueryComment(pid int64) (json_ []byte, err error) { var res []Comment stmt, err := db.Prepare(queryStmt) checkError(err) defer stmt.Close() rows, err := stmt.Query(pid) checkError(err) defer rows.Close() for rows.Next() {var c Commenterr = rows.Scan(&c.ID, &c.UID, &c.Text, &c.Pid, &c.Date, &c.Name)checkError(err)res = append(res, c) } json_, err = json.Marshal(res) checkError(err) return}
简单HTTP服务器server.go我们分别判断请求方法,要求删除和插入只能用post请求,查询只能用get请求 。使用r.ParseForm() 处理表单 。
r.Form["uid"]
本质上拿到的字符串数组,需要进行显式类型转换 。
db "wolflong.com/vue_comment/lib/sqlite"
引入了前面写的数据库处理包 。因为考虑到不一定要用 sqlite,未来可能会使用 mysql、mongoDB 。目前已经强耦合了,即当前http服务器的实现跟sq3_vue包紧密相关,考虑用接口降低耦合程度 。
type comment interface { QueryComment(pid int64) (json_ []byte, err error) InsertComment(uid, pid int64, text string) (json_ []byte, err error) DeleteComment(id int64) error}var c comment = db.Comment{}
我们将数据库行为接收者指派为Comment类型,当该类型实现了三个对应函数签名的方法就实现了comment接口 。此时我们创建一个空Comment类型赋值给comment接口变量 。那么其他数据库逻辑处理包只要提供实现comment接口的类型对象就好了 。换什么数据库也影响不到当前HTTP的处理逻辑 。
经验总结扩展阅读
- 我的别称
- 2022年冬至祝福语简短
- 上海二手奢侈品店探店笔记,我的大牌日记 大牌包一直是我的心头爱
- 一篇文章带你了解网页框架——Vue简单入门
- 他说的全是我的词啊是什么梗
- 真的爱上一个人后会变得没有自我的星座
- vue项目Eslint和prettier结合使用
- Vue3 JS 与 SCSS 变量相互使用
- 带走一盏-“带走一盏渔火,让它温暖我的双眼……”选自《涛声依旧》,其歌词和意境借 ...
- Vue 中为什么要有nextTick?