[go]mysql使用
mysql驱动使用
初始化
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
DB, err = sql.Open("mysql", "root:root@tcp(localhost:3306)/golang_db")
DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(16)
一次查多行
type User struct {
Id int64 `db:"id"`
Name sql.NullString `db:"string"`
Age int `db:"age"`
}
rows, err := DB.Query("select id, name, age from user where id > ?", 0)
//重点关注, rows对象一定要close掉
defer func() {
if rows != nil {
rows.Close()
}
}()
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
for rows.Next() {
var user User
err := rows.Scan(&user.Id, &user.Name, &user.Age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
测试查询
row := DB.QueryRow("select id, name, age from user where id=?", 2)
for rows.Next() {
var user User
err := row.Scan(&user.Id, &user.Name, &user.Age)
id, err := result.LastInsertId()
fmt.Printf("id is %d\n", id)
}
插入
result, err := DB.Exec("insert into user(name, age) values(?, ?)", "tom", 18)
id, err := result.LastInsertId()
fmt.Printf("id is %d\n", id)
更新
result, err := DB.Exec("update user set name=? where id=?", "jim", 3)
affected, err := result.RowsAffected()
fmt.Printf("update db succ, affected rows:%d\n", affected)
删除
sqlstr := "delete from user where id=?"
result, err := DB.Exec(sqlstr, 3)
affected, err := result.RowsAffected()
fmt.Printf("delete db succ, affected rows:%d\n", affected)
prepare data
stmt, err := DB.Prepare("select id, name, age from user where id > ?")
defer func() {
if stmt != nil {
stmt.Close()
}
}()
rows, err := stmt.Query(0)
defer func() {
if rows != nil {
rows.Close()
}
}()
for rows.Next() {
var user User
err := rows.Scan(&user.Id, &user.Name, &user.Age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
prepare处理流程
好处:
事务
conn, err := DB.Begin()
_, err = conn.Exec("update user set age = 1 where id = ?", 1)
if err != nil {
conn.Rollback()
fmt.Printf("exec sql:%s failed, err:%v\n", sqlstr, err)
return
}
_, err = conn.Exec("update user set age = 2 where id = ?", 2)
if err != nil {
conn.Rollback()
fmt.Printf("exec second sql:%s failed, err:%v\n", sqlstr, err)
return
}
err = conn.Commit()
if err != nil {
fmt.Printf("commit failed, err:%v\n", err)
conn.Rollback()
return
}
sqlx的使用
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
//更新
db, _ := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/mydb")
result, e := db.Exec("update person set name = ? where id = ?","张一蛋",1)
rowsAffected, _ := result.RowsAffected() //受影响的行数
lastInsertId, _ := result.LastInsertId() //最后一行的ID
// 查询
/*该结构体对应着数据库里的person表*/
type Person struct {
//对应name表字段
Name string `db:"name"`
//对应age表字段
Age int `db:"age"`
//对应rmb表字段
Money float64 `db:"rmb"`
}
var ps []Person
e := database.Select(&ps, "select name,age,rmb from person where name like ?", "%蛋")
汇总demo
mysql
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
)
var DB *sql.DB
func initDb() error {
var err error
dsn := "root:root@tcp(localhost:3306)/golang_db"
DB, err = sql.Open("mysql", dsn)
if err != nil {
return err
}
DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(16)
return nil
}
type User struct {
Id int64 `db:"id"`
Name sql.NullString `db:"string"`
Age int `db:"age"`
}
func testQueryMultilRow() {
sqlstr := "select id, name, age from user where id > ?"
rows, err := DB.Query(sqlstr, 0)
//重点关注, rows对象一定要close掉
defer func() {
if rows != nil {
rows.Close()
}
}()
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
for rows.Next() {
var user User
err := rows.Scan(&user.Id, &user.Name, &user.Age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
}
func testQueryData() {
for i := 0; i < 101; i++ {
fmt.Printf("query %d times\n", i)
sqlstr := "select id, name, age from user where id=?"
row := DB.QueryRow(sqlstr, 2)
/*if row != nil {
continue
}*/
var user User
err := row.Scan(&user.Id, &user.Name, &user.Age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%v age:%d\n", user.Id, user.Name, user.Age)
}
}
func testInsertData() {
sqlstr := "insert into user(name, age) values(?, ?)"
result, err := DB.Exec(sqlstr, "tom", 18)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Printf("get last insert id failed, err:%v\n", err)
return
}
fmt.Printf("id is %d\n", id)
}
func testUpdateData() {
sqlstr := "update user set name=? where id=?"
result, err := DB.Exec(sqlstr, "jim", 3)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
affected, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected rows failed, err:%v\n", err)
}
fmt.Printf("update db succ, affected rows:%d\n", affected)
}
func testDeleteData() {
sqlstr := "delete from user where id=?"
result, err := DB.Exec(sqlstr, 3)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
affected, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected rows failed, err:%v\n", err)
}
fmt.Printf("delete db succ, affected rows:%d\n", affected)
}
func testPrepareData() {
sqlstr := "select id, name, age from user where id > ?"
stmt, err := DB.Prepare(sqlstr)
if err != nil {
fmt.Printf("prepare failed, err:%v\n", err)
return
}
defer func() {
if stmt != nil {
stmt.Close()
}
}()
rows, err := stmt.Query(0)
//重点关注, rows对象一定要close掉
defer func() {
if rows != nil {
rows.Close()
}
}()
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
for rows.Next() {
var user User
err := rows.Scan(&user.Id, &user.Name, &user.Age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
}
func testPrepareInsertData() {
sqlstr := "insert into user(name, age) values(?, ?)"
stmt, err := DB.Prepare(sqlstr)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
defer func() {
if stmt != nil {
stmt.Close()
}
}()
result, err := stmt.Exec("jim", 100)
id, err := result.LastInsertId()
if err != nil {
fmt.Printf("get last insert id failed, err:%v\n", err)
return
}
fmt.Printf("id is %d\n", id)
}
func testTrans() {
conn, err := DB.Begin()
if err != nil {
if conn != nil {
conn.Rollback()
}
fmt.Printf("begin failed, err:%v\n", err)
return
}
sqlstr := "update user set age = 1 where id = ?"
_, err = conn.Exec(sqlstr, 1)
if err != nil {
conn.Rollback()
fmt.Printf("exec sql:%s failed, err:%v\n", sqlstr, err)
return
}
sqlstr = "update user set age = 2 where id = ?"
_, err = conn.Exec(sqlstr, 2)
if err != nil {
conn.Rollback()
fmt.Printf("exec second sql:%s failed, err:%v\n", sqlstr, err)
return
}
err = conn.Commit()
if err != nil {
fmt.Printf("commit failed, err:%v\n", err)
conn.Rollback()
return
}
}
func main() {
err := initDb()
if err != nil {
fmt.Printf("init db failed, err:%v\n", err)
return
}
//testQueryData()
//testQueryMultilRow()
//testInsertData()
//testUpdateData()
//testDeleteData()
//testPrepareData()
//testPrepareInsertData()
testTrans()
}
sqlx
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var DB *sqlx.DB
func initDb() error {
var err error
dsn := "root:root@tcp(localhost:3306)/golang_db"
DB, err = sqlx.Open("mysql", dsn)
if err != nil {
return err
}
DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(16)
return nil
}
type User struct {
Id int64 `db:"id"`
Name sql.NullString `db:"name"`
Age int `db:"age"`
}
func testQuery() {
sqlstr := "select id, name, age from user where id=?"
var user User
err := DB.Get(&user, sqlstr, 2)
if err != nil {
fmt.Printf("get failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
func testQueryMulti() {
sqlstr := "select id, name, age from user where id>?"
var user []User
err := DB.Select(&user, sqlstr, 1)
if err != nil {
fmt.Printf("get failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
func testUpdate() {
sqlstr := "update user set name=? where id=?"
result, err := DB.Exec(sqlstr, "abc", 1)
if err != nil {
fmt.Printf("update failed, err:%v\n", err)
return
}
count, err := result.RowsAffected()
if err != nil {
fmt.Printf("affected rows failed, err:%v\n", err)
return
}
fmt.Printf("affect rows:%d\n", count)
}
func queryDB(name string) {
sqlstr := fmt.Sprintf("select id, name, age from user where name='%s'", name)
fmt.Printf("sql:%s\n", sqlstr)
var user []User
err := DB.Select(&user, sqlstr)
if err != nil {
fmt.Printf("select failed, err:%v\n", err)
return
}
for _, v := range user {
fmt.Printf("user:%#v\n", v)
}
}
func queryDBBySqlx(name string) {
sqlstr := "select id, name, age from user where name=?"
//fmt.Printf("sql:%s\n", sqlstr)
var user []User
err := DB.Select(&user, sqlstr, name)
if err != nil {
fmt.Printf("select failed, err:%v\n", err)
return
}
for _, v := range user {
fmt.Printf("user:%#v\n", v)
}
}
func testSqlInject() {
//queryDB("abc' or 1 = 1 #")
//queryDB("name=abc' and (select count(*) from user ) < 10#")
//queryDB("name=123' union select *from user #")
queryDBBySqlx("name=123' union select *from user #")
}
func main() {
err := initDb()
if err != nil {
fmt.Printf("init db failed, err:%v\n", err)
return
}
//testQuery()
//testQueryMulti()
//testUpdate()
testSqlInject()
}
[go]mysql使用的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- 17.SpringMVC核心技术-拦截器
SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定 的用户请求, 并进行相应的预处理与后处理.其拦截的时间点在“处理器映射器根据用户提 交的请求映射 ...
- 【python】写csv文件时遇到的错误
1.错误 在许多文件中,写入csv文件时都加"wb",w指写入,b指二进制 如: csvwrite=csv.writer(open("output.csv",& ...
- Maven新建项目出现 Could not calculate build plan:plugin 错误解决办法
删除本地.m2仓库中 org.apache.maven.plugins:maven-resources-plugin所在目录. 然后右击项目 Maven->Update Project-> ...
- 03_Hive的交互方式
之前使用的Shell方式只是Hive交互方式中的一种,还有一种就是将Hive启动为服务运行在一个节点上,那么剩下的节点 就可以使用客户端来连接它,从而也可以使用Hive的数据分析服务 1.Hive的交 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- set调用add报错:
Map<String, String> goodsStandMap = new HashMap<>();goodsStandMap.put("key1", ...
- async 与 await
async 关键字 1.含义:表示函数是一个异步函数,意味着该函数的执行不会阻塞后面代码的执行 2.定义与调用 async function hello (flag) { if (flag) { re ...
- Excel 中大量图片如何快速导出? 转载自:http://www.zhihu.com/question/20800948
我的办法如下,应该也不慢. 如果是针对以.xlsx为后缀的表格(Excel2007以上的版本),这样做:显示后缀的情况下,直接重命名,把后缀.xlsx改成.rar或者.zip,然后解压出里面的图片文件 ...
- nginx限流&健康检查
Nginx原生限流模块: ngx_http_limit_conn_module模块 根据前端请求域名或ip生成一个key,对于每个key对应的网络连接数进行限制. 配置如下: http模块 ser ...
- hive数据仓库表设计之(矮宽表+高窄表)
昨天面对某客户域做表关联的时候发现了. 有两张相同内容的主表.但是表的设计结构并不相同: (每个领域都有主表,每次往这个领域(库)添加新表的时候一般都会join 主表,从而有唯一的主键id) 这两个表 ...