golang提供了sql包查询数据

建立连接

导入第三方包

import(
"database/sql"
_"github.com/go-sql-driver/mysql"
)

open打开

db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/databases")

 返回一个db类型后续会用来操作sql语句,err校验

if err != nil{
log.Fatal(err)
}

这里需要注意的是open打开并不会校验数据源是否有效,所以需要ping一下,如果不进行ping的话,以往情况会有些童鞋因为数据源不通关闭等导致的错位在纠结半天。

err = db.Ping()
if err!= nil {
log.Fatal(err)
}

开始操作

sql包为我们提供了几种增删改查的方法

  • DB.Exec():执行不返回行(row)的查询,比如INSERT,UPDATE,DELETE
  • DB.Query():用于检索(retrieval),比如SELECT
  • DB.QueryRow():用于返回单行的查询,然后转交给DB.Query()查询
  • db.Prepare():返回一个Stmt。Stmt对象可以执行Exec,Query,QueryRow等操作。最后要close()

而db.Prepare会为我们返回一个stmt对象,然后stmt.QueryRow等去操作

db.Prepare

stmt,err := db.Prepare("select name from groups")
//查询
// 不添加Where条件
rows, err := stmt.Query()
defer stmt.Close()
for rows.Next() {
var value string
if ers := rows.Scan(&value); ers == nil {
fmt.Println(value)
}
} // 添加where条件
stmt,err := db.Prepare("select name from groups where id=?")
var name string
err = stmt.QueryRow(15).Scan(&name)
fmt.Println(name) var names [] string
rows,err:= stmt.Query(15)
defer rows.Close()
for rows.Next(){
var name string
if err:= rows.Scan(&name); err!= nil {
log.Fatal(err)
}
names = append(names,name)
} //增加数据
stmt, err := db.Prepare(`INSERT student (name,age) values (?,?)`)
res, err := stmt.Exec("wangwu", 26)
id, err := res.LastInsertId()
fmt.Println("自增id=", id)
//修改数据
stmt, err := db.Prepare(`UPDATE student SET age=? WHERE id=?`)
res, err := stmt.Exec(21, 5)
num, err := res.RowsAffected() //影响行数
fmt.Println(num)
//删除数据
stmt, err := db.Prepare(`DELETE FROM student WHERE id=?`)
res, err := stmt.Exec(5)
num, err := res.RowsAffected()
fmt.Println(num)

db操作

查询

rows, err := db.Query("SELECT * FROM groups")
//构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
columns, _ := rows.Columns()
scanArgs := make([]interface{}, len(columns))
values := make([]interface{}, len(columns))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
//将行数据保存到record字典
err = rows.Scan(scanArgs...)
record := make(map[string]string)
for i, col := range values {
if col != nil {
record[columns[i]] = string(col.([]byte))
}
}
fmt.Println(record)
}

删除,增加,修改同db.Prepare语法,只是直接db.去调用即可

事务

sql包通过db.Begin()来开启一个事务, 通过Commit()和Rollback()方法来关闭。

tx := db.Begin()
tx.Rollback() // 回滚
tx.Commit()
//然后通过tx操作Exec, Query, QueryRow and Prepare 方法,流程和上面一样。示例
tx, err := db.Begin()
stmt, err := tx.Prepare(`UPDATE student SET age=? WHERE id=?`)
_, err = stmt.Exec(18, 5)
if err != nil {
tx.Rollback()
panic(err)
}
err = tx.Commit()
if err != nil {
tx.Rollback()
panic(err)
}

  

 

  

  

golang 之 sql的更多相关文章

  1. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  2. golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器

    收到一个任务,所有http的handler要对入参检查,防止SQL注入.刚开始笨笨的,打算为所有的结构体写一个方法,后来统计了下,要写几十上百,随着业务增加,以后还会重复这个无脑力的机械劳作.想想就l ...

  3. golang database sql DSN (Data Source Name)中的timeout, readTimeout

    golang 语言,在打开mysql DB时,有时会用到timeout,readTimeout两个参数. 1.timeout 建立连接超时时间 例如, "30s", "0 ...

  4. golang——database/sql包学习

    1.database/sql包 sql包提供了保证SQL或类SQL数据库的泛用接口. 使用sql包时必须注入(至少)一个数据库驱动. (1)获取mysql driver:go get -v githu ...

  5. golang语言sql Rows转化保存成map

    func DoQuery(db *sql.DB, sqlInfo string, args ...interface{}) ([]map[string]interface{}, error) { ro ...

  6. golang: 把sql结果集以json格式输出

    func getJSON(sqlString string) (string, error) { stmt, err := db.Prepare(sqlString) if err != nil { ...

  7. go-mysql: database/sql 接口适配

    go-mysql已经支持golang database/sql接口,并通过https://github.com/bradfitz/go-sql-test测试用例. 现在go-mysql可以直接通过go ...

  8. golang中mysql建立连接超时时间timeout 测试

    本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...

  9. 我的Vue之旅 10 Gin重写后端、实现页面详情页 Mysql + Golang + Gin

    第三期 · 使用 Vue 3.1 + Axios + Golang + Mysql + Gin 实现页面详情页 使用 Gin 框架重写后端 Gin Web Framework (gin-gonic.c ...

随机推荐

  1. TCP/IP协议族基本知识

    常见的网络拓扑 两台主机通信的过程:应用进程产生消息,经由主机的 TCP/IP 协议栈发送到局域网(LAN),最后经过广域网(目前最大的广域网的因特网)中的网络设备(路由器)传给目的主机所在的局域网( ...

  2. UmiJS可插拔的企业级 react 应用框架,配合ant-design-pro使用

    入门非常简单 # 安装 $ yarn global add umi # 或者 npm install -g umi # 新建应用 $ mkdir myapp && cd myapp # ...

  3. ring3 x32挂起进程注入原理.

    目录 一丶挂起进程注入简介与前言 二丶ShellCode核心讲解. 2.1 保存Contex.EIP 2.2 DLL路径重定位 2.3 LoadLibrary的重定位 三丶 全部C++代码.拷贝即可使 ...

  4. win10系统2分钟睡眠

    https://blog.csdn.net/widenstage/article/details/78982722 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...

  5. 第10组 Alpha冲刺(1/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 学习Android studio和Java,基本了解APP前端的制作 完善项目APP原型 展示GitHu ...

  6. JDBC PreparedStatement Statement

    参考:预编译语句(Prepared Statements)介绍,以MySQL为例 1. 背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相 ...

  7. 七年老运维实战中的 Shell 开发经验总结【转】

    无论是系统运维,还是应用运维,均可分为“纯手工”—> “脚本化”—> “自动化”—>“智能化”几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避 ...

  8. Vue系列——如何运行一个Vue项目

    声明 本文转自:如何运行一个Vue项目 正文 一开始很多刚入手vue.js的人,会扒GitHub上的开源项目,但是发现不知如何运行GitHub上的开源项目,很尴尬.通过查阅网上教程,成功搭建好项目环境 ...

  9. IM (二):数据通信协议的选择

    https://www.jianshu.com/p/e9c2b7c48c34 http://www.52im.net/thread-283-1-1.html https://github.com/Ja ...

  10. java多线程(二)线程的生命周期

    1.   线程生命周期 新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)5种状态. 1.1. 新建 l  new关键字创建了一个线程之后,该线 ...