Golang操作SQL: 增删改查

本文详细介绍了SQL编码的最佳实践,包括如何防止SQL注入,使用占位符方式来构建SQL语句。同时,展示了查询、插入、更新数据的示例代码,强调了QueryRow和Query的区别以及在处理查询结果时的注意事项。此外,还提供了构造查询条件的辅助函数,确保灵活和安全地执行数据库操作。
摘要由CSDN通过智能技术生成

参考链接:sql增删改查    CRUD

sql编码注意事项

1. 采用占位符的方式,防止sql注入,尽可能避免使用字符串拼接

连接

*tmpDB, err = sql.Open("mysql", connUrl)

查询  

QueryRow()   查询单条    特殊错误码 err == sql.ErrNoRows  

rowTotal := getDBConn().QueryRow(sqlTotalStr, whereArgs...)
err = rowTotal.Scan(&stRsp.ITotal)
if err != nil {
	log.Errorf("exec sql fail, sqlStr:%s, Args:%v, err:%v", sqlTotalStr, whereArgs, err)
	return "", err
}

Query()      查询多条

// Query()
querySQL := `
		SELECT col1, col2
		FROM table_name
		where
	`
querySQL += whereConds
rows, err := getDBConn().Query(querySQL, whereArgs...)
if err != nil {
	log.Errorf("exec sql success, sqlStr:%s, Args:%v, err:%v", querySQL, whereArgs, err)
	return "", err
}
defer rows.Close() // 关闭

log.Debugf("exec sql success, sqlStr:%s, Args:%v", querySQL, whereArgs)
for rows.Next() { // 遍历
	if err := rows.Scan(&val1, &val2),
	); err != nil {
		log.Error("scan err:", err)
		return "", err
	}
	// deal
}

插入

func insertDB(stReq *proto_admin.AdminSendGuildInviteMsgReq) (err error) {
	insertSql := `
			INSERT INTO table_name (
				col1, col2, col3, 
				col4, col5, col6
			) 
			VALUES (
				?, ?, ?,
				val4, val5, val6
			)
		`
	insertArgs := []interface{}{
		val1,
		val2, 
		val3,
	}
	log.Debugf("exec sql, insertSql:%s, insertArgs:%v", insertSql, insertArgs)
	_, err = getDBconn().Exec(insertSql, insertArgs...) // 参数insertArgs后面必须加...
	if err != nil {
		log.Errorf("exec sql fail, insertSql:%s, insertArgs:%v, err:%v", insertSql, insertArgs, err)
		return err
	}

	return nil
}

更新

func updateDB(stReq *proto_admin.AdminSendGuildInviteMsgReq) (err error) {
	updateSql := `
			UPDATE table_name
			SET
				col1=?, 
				col2=val2, col3=val3, col4=val4
			where 
				col5=? and col6=? and col7=?
		`
	updateArgs := []interface{}{
		val1, 
		val5, 
		val6, 
		val7,
	}
	log.Debugf("exec sql, updateSql:%s, updateArgs:%v", updateSql, updateArgs)
	_, err = getDBconn().Exec(updateSql, updateArgs...)
	if err != nil {
		log.Errorf("exec sql fail, updateSql:%s, updateArgs:%v, err:%v", updateSql, updateArgs, err)
		return err
	}

	return nil
}

构造条件

// 构造查询语句、查询条件
func genWhereForQyin(req *Request) (string, []interface{}, error) {
	var (
		whereConds = make([]string, 0)
		whereArgs  = make([]interface{}, 0)
	)

	if req.colval1 != "" {
		whereConds = append(whereConds, "col like CONCAT('%', ?, '%')") // 模糊查询like
		whereArgs = append(whereArgs, req.colval1)
	}

	if req.colval2 != 0 {
		whereConds = append(whereConds, "col2=?")
		whereArgs = append(whereArgs, colval2)
	}

	return strings.Join(whereConds, " and "), whereArgs, nil
}

func test() {
	// 构造: 查询条件
	whereConds, whereArgs, err := genWhereForQyin(req)
	if err != nil {
		log.Errorf("genWhereForQyin fail, err%v", err)
		return "", err
	}

	// 查询语句
	sqlTotalStr := `
			SELECT COUNT(*) 
			FROM table_name 
			where
		`
	sqlTotalStr += whereConds
	rowTotal := getDBConn().QueryRow(sqlTotalStr, whereArgs...)
	err = rowTotal.Scan(&total)
	if err != nil {
		log.Errorf("exec sql fail, sqlStr:%s, Args:%v, err:%v", sqlTotalStr, whereArgs, err)
		return "", err
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值