关于 sql:https://studygolang.com/articles/3022

异常处理: http://www.jianshu.com/p/f30da01eea97

一、数据库的连接及初始化

// demo_db.go

package main

import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
) var (
db *sql.DB
) func check(err error) {
if err != nil {
fmt.Println(err)
}
} func InitDB(mydb *sql.DB) {
db = mydb
} func main() {
mydb, err := sql.Open("mysql", "root:root@tcp(localhost:3306)/imooc")
check(err)
defer mydb.Close() InitDB(mydb)
fmt.Println(db)
}

二、增删改查

// demo_method.go

package main

import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
) var (
db *sql.DB
) func check(err error) {
if err != nil {
fmt.Println(err)
}
} func InitDB(mydb *sql.DB) {
db = mydb
} func DemoExec() {
sql_insert := "insert user set username=?"
result, err := db.Exec(sql_insert, "xiaoming")
check(err)
rows, err := result.RowsAffected()
check(err)
fmt.Printf("rows affected: %d\n", rows)
} func DemoQuery() {
sql_query := "select acctid from account where money=?"
rows, err := db.Query(sql_query, 2000)
defer rows.Close()
check(err)
for rows.Next() {
var id int
if err := rows.Scan(&id); err != nil {
fmt.Println(err)
}
fmt.Printf("id: %d\n", id)
}
} func DemoQueryRow() {
var id int
sql_query := "select acctid from account where money=?"
row := db.QueryRow(sql_query, 2000)
err := row.Scan(&id)
check(err)
fmt.Printf("id: %d\n", id)
} func DemoPrepare() {
stmt, err := db.Prepare("select username from user where userid=?")
check(err) rows, err := stmt.Query(3)
defer rows.Close()
check(err) for rows.Next() {
var username string
if err := rows.Scan(&username); err != nil {
fmt.Println(err)
}
fmt.Printf("username: %s\n", username)
}
} func main() {
mydb, err := sql.Open("mysql", "root:root@tcp(localhost:3306)/imooc")
check(err)
defer mydb.Close()
InitDB(mydb) DemoExec()
DemoQuery()
DemoQueryRow()
DemoPrepare()
}

三、事务

// demo_transaction.go

package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
"log"
) var (
db *sql.DB
tx *sql.Tx
) func check(err error) {
if err != nil {
fmt.Println(err)
}
} func InitDB(mydb *sql.DB) {
db = mydb
} func InitTx(mytx *sql.Tx) {
tx = mytx
} func CheckAccountAvaiable(acctid int) {
sql := "select * from account where acctid=?"
rows,err := tx.Query(sql, acctid)
// 如果不调用rows.Close,conn无法回到 tx上
defer rows.Close()
if err != nil {
log.Println(err)
panic(fmt.Sprintf("查询错误,账号%d不可得!", acctid))
}
if !rows.Next() {
panic(fmt.Sprintf("查询失败,账号%d不可得!", acctid))
}
} func HasEnoughMoney(acctid, money int) {
sql := "select * from account where acctid=? and money>=?"
rows,err := tx.Query(sql, acctid, money)
defer rows.Close()
if err != nil {
log.Println(err)
panic(fmt.Sprintf("用户%d余额查询失败!", acctid))
}
if !rows.Next() {
panic(fmt.Sprintf("用户%d余额不足!", acctid))
}
} func ReduceMoney(acctid, money int) {
sql := "update account set money = money-? where acctid = ?"
_,err := tx.Exec(sql, money, acctid)
if err != nil {
log.Println(err)
panic(fmt.Sprintf("用户%d减款失败!", acctid))
}
} func AddMoney(acctid, money int) {
sql := "update account set money =money+? where acctid = ?"
_,err := tx.Exec(sql, money, acctid)
if err != nil {
log.Println(err)
panic(fmt.Sprintf("用户%d加款失败!", acctid))
}
} func Transfer(source_acctid, target_acctid, money int) {
tx,err := db.Begin()
check(err)
InitTx(tx) defer func() {
if err := recover(); err != sql.ErrTxDone && err != nil {
fmt.Printf("出错了 ERR:%s\n", err)
tx.Rollback()
} else {
tx.Commit()
fmt.Printf("%d转给%d一共%d元, 转账成功!",source_acctid, target_acctid, money)
}
}() CheckAccountAvaiable(source_acctid)
CheckAccountAvaiable(target_acctid)
HasEnoughMoney(source_acctid, money)
ReduceMoney(source_acctid, money)
AddMoney(target_acctid, money)
} func main() {
mydb,err := sql.Open("mysql", "root:root@tcp(localhost:3306)/imooc")
check(err)
defer mydb.Close() InitDB(mydb)
Transfer(4, 3, 500)
}

sql 脚本

$ source imooc.sql

imooc.sql

-- MySQL dump 10.16  Distrib 10.1.28-MariaDB, for Linux (x86_64)
--
-- Host: localhost Database: imooc
-- ------------------------------------------------------
-- Server version 10.1.28-MariaDB /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; --
-- Table structure for table `account`
-- DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account` (
`acctid` int(11) NOT NULL AUTO_INCREMENT,
`money` int(6) DEFAULT NULL,
PRIMARY KEY (`acctid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; --
-- Dumping data for table `account`
-- LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
INSERT INTO `account` VALUES (1,2000),(2,1300),(3,2800),(4,4000);
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES; --
-- Table structure for table `user`
-- DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(11) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; --
-- Dumping data for table `user`
-- LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'lisi'),(2,'zhangsan'),(3,'liuqi'),(4,'white'),(5,'xiaoming'),(6,'xiaoming'),(7,'xiaoming'),(8,'xiaoming'),(9,'xiaoming'),(10,'xiaoming'),(11,'xiaoming'),(12,'xiaoming'),(13,'xiaoming'),(14,'xiaoming'),(15,'xiaoming'),(16,'xiaoming'),(17,'xiaoming');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2017-10-15 20:27:53

go 的 mysql 的简单操作的更多相关文章

  1. Linux下MySQL的简单操作

    Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...

  2. MySQL基本简单操作03

    MySQL基本简单操作 现在我创建了一个数据表,表的内容如下: mysql> select * from gubeiqing_table; +----------+-----+ | name | ...

  3. MySQL基本简单操作02

    MySQL基本简单操作 先进入Mysql容器. [root@promote ~]# docker exec -it mysql /bin/bash root@30d60b852cf5:/# mysql ...

  4. MySQL基本简单操作01

    MySQL基本简单操作 学会了安装Docker,那么就将它利用起来.(/滑稽脸) 之前想学习Mysql(Windows下配置真麻烦),学会了Docker就方便了,直接使用Docker创建一个Mysql ...

  5. Ubuntu 安装mysql和简单操作

    http://www.cnblogs.com/zhuyp1015/p/3561470.html ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get inst ...

  6. python对mysql进行简单操作

    python 连接MySQL数据库,进行简单操作 一.连接MySQL数据库,关闭连接 import pymysql db = pymysql.connect(host="xxx.xxx.x. ...

  7. Ubuntu下安装MySQL及简单操作

    Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client ...

  8. MySQL数据库简单操作

    title date tags layout MySQL简单操作 2018-07-16 Linux post 登录mysql mysql -h 主机名 -u 用户名 -p 查看所有数据库 show d ...

  9. MySQL 基础 简单操作

    一.数据库基础 什么是数据库 数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表:是一种结构化的文件,可以用来存储数据(类似Excel表).数据库就是由成千上万个表组成. 什么事SQL ...

  10. MySQL 空间数据 简单操作

    在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库. 现在用的就是 MySQL ,就继续用 MySQL 来存储.管理空间数据.下面就做一些 ...

随机推荐

  1. Android系统资源图标android.R.drawable

    Android™ 2.1 android.R.drawable Icon Resources Android™ 1.5 android.R.drawable Icon Resources Androi ...

  2. 《Unix&Linux大学教程》学习笔记6——Unix文件系统

    1:Unix文件类型——3种 普通文件(常规文件):文本文件(纯文本.脚本.源程序.配置文件.html等).二进制文件(多媒体文件.数据库等) 目录:用于组织文件 伪文件:不存储数据,目的是提供一种服 ...

  3. 【PMP】项目风险管理~重点知识

    1.什么是风险,项目的风险从哪里来? 开展项目,不仅要面对各种制约因素和假设条件,而且还要应对可能相互冲突和不断变化的相关方期望.组织应该有目的的以可控方式去冒项目风险,以便平衡风险和回报,并创造价值 ...

  4. SQL Server 数据库基础笔记分享(下)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  5. Android解决NDK not configured问题

    问题描述: // Error:Execution failed for task ':SoftkeyApp:compileDebugNdk'. // > NDK not configured. ...

  6. [android开发教程] 一个神奇的Demo 帮你掌握所有android控件

    (本文内容来源:http://www.eoeandroid.com/thread-182392-1-1.html  转载请注明出处!) 2.jpg (23.78 KB, 下载次数: 0) 下载附件   ...

  7. 用.NET CORE做项目,VS里编译碰到‘。。。。包降级。。。。’错误

    用.NET CORE做项目,VS里编译碰到‘....包降级....’错误 本地开发机:WIN10+VS2017 15.7.3 ,用CORE2.1版本的建立一个项目,做好了,传到gitee上 今天有新同 ...

  8. default listener is not configured in grid infrastructure home

    Oracle Restart enable database creation requries Default listener configured and running in Grid Inf ...

  9. 【转】python实战——教你用微信每天给女朋友说晚安

    但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每天给朋友定时微信发送”晚安“,故事,新闻,等等··· ··· 最好运行在服务器上,这样后台挂起来更方便. #!/ ...

  10. STM32云平台连接培训20180814

    MQTT基于TCP,发布订阅模式,一对多,多对一,TCP需要client主动建立connect,server发送connectack CoAP基于UDP,请求/应答模式,数据量也相对HTTP要小 HT ...