go操作数据库(2) | 青训营笔记

43 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

一、CRUD

这些是数据库比较常用的操作,就只是列举下操作,不深入探讨了。

1、建库建表

2、查询

(1)单行查询

(2)多行查询

3、插入

4、更新

5、删除

二、MySql预处理

普通SQL语句执行过程:

image.png 预处理执行过程:

预处理执行过程:

image.png

为什么要预处理?

  1. 优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本。
  2. 避免SQL注入问题。

SQL注入问题

// sql注入示例
func sqlInjectDemo(name string) {
	sqlStr := fmt.Sprintf("select id, name, age from user where name='%s'", name)
	fmt.Printf("SQL:%s\n", sqlStr)
	var u user
	err := db.QueryRow(sqlStr).Scan(&u.id, &u.name, &u.age)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	fmt.Printf("user:%#v\n", u)
}

究竟会出现哪些问题呢? 比如我此时根本不知道数据库的信息,但是我却可以通过下面这条语句,访问数据库信息

sqlInjectDemo("xxx' or 1=1#")

//控制台显示:
SQL:select id, name, age from user where name='xxx' or 1=1#'
user:main.user{id:1, age:18, name:"ggboy"}  
因为or 1=1,会执行后半部分

今天还学了sqlx这个库的增删改查。明天要步入中间件之类的学习!