go 的 mysql 的简单操作
关于 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 的简单操作的更多相关文章
- Linux下MySQL的简单操作
Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...
- MySQL基本简单操作03
MySQL基本简单操作 现在我创建了一个数据表,表的内容如下: mysql> select * from gubeiqing_table; +----------+-----+ | name | ...
- MySQL基本简单操作02
MySQL基本简单操作 先进入Mysql容器. [root@promote ~]# docker exec -it mysql /bin/bash root@30d60b852cf5:/# mysql ...
- MySQL基本简单操作01
MySQL基本简单操作 学会了安装Docker,那么就将它利用起来.(/滑稽脸) 之前想学习Mysql(Windows下配置真麻烦),学会了Docker就方便了,直接使用Docker创建一个Mysql ...
- Ubuntu 安装mysql和简单操作
http://www.cnblogs.com/zhuyp1015/p/3561470.html ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get inst ...
- python对mysql进行简单操作
python 连接MySQL数据库,进行简单操作 一.连接MySQL数据库,关闭连接 import pymysql db = pymysql.connect(host="xxx.xxx.x. ...
- Ubuntu下安装MySQL及简单操作
Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client ...
- MySQL数据库简单操作
title date tags layout MySQL简单操作 2018-07-16 Linux post 登录mysql mysql -h 主机名 -u 用户名 -p 查看所有数据库 show d ...
- MySQL 基础 简单操作
一.数据库基础 什么是数据库 数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表:是一种结构化的文件,可以用来存储数据(类似Excel表).数据库就是由成千上万个表组成. 什么事SQL ...
- MySQL 空间数据 简单操作
在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库. 现在用的就是 MySQL ,就继续用 MySQL 来存储.管理空间数据.下面就做一些 ...
随机推荐
- zeromq学习笔记1——centos下安装 zeromq-4.1.2
1.前言 MQ(message queue)是消息队列的简称,可在多个线程.内核和主机盒之间弹性伸缩.ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”.现在还未看到它们的成功. ...
- Spark2.2+ES6.4.2(三十一):Spark下生成测试数据,并在Spark环境下使用BulkProcessor将测试数据入库到ES
Spark下生成2000w测试数据(每条记录150列) 使用spark生成大量数据过程中遇到问题,如果sc.parallelize(fukeData, 64);的记录数特别大比如500w,1000w时 ...
- 从Encoder到Decoder实现Seq2Seq模型
https://zhuanlan.zhihu.com/p/27608348 更新:感谢@Gang He指出的代码错误.get_batches函数中第15行与第19行,代码已经重新修改,GitHub已更 ...
- Nginx软件优化
1.1 Nginx优化分类 安全优化(提升网站安全性配置) 性能优化(提升用户访问网站效率) 1.2 Nginx安全优化 1.2.1 隐藏nginx版本信息优化 官方配置参数说明:http://ngi ...
- maven 设置跳过测试
1.在执行mvn命令时增加以下参数可以跳过测试: -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test ...
- 迷你音乐播放器v1.0正式上线!
迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...
- JAVA中对List<Map<String,Object>>中的中文汉字进行排序
转载于:http://blog.csdn.net/flykos/article/details/54631573 参考:http://www.jb51.net/article/88710.htm 本篇 ...
- (转)超过 130 个你需要了解的 vim 命令
从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一.5 年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你 ...
- 【Android】详解Android 网络操作
目录结构: contents structure [+] 判断网络 判断是否有网络连接 判断WIFI网络是否可用 判断MOBILE网络是否可用 获取当前网络连接的类型信息 监听网络 获取网络信息需要在 ...
- Service discovery
https://www.cnblogs.com/dirt2/p/5987067.html Use Assigned Numbers in the Service Discovery Protocol ...