文档章节

Go操作MySQL数据库

秋风醉了
 秋风醉了
发布于 2016/08/13 18:00
字数 607
阅读 86
收藏 4

Go操作MySQL数据库

主要的结构体DB和基于该结构体的方法

type DB
func (db DB) Begin() (Tx, error)
func (db *DB) Close() error
func (db *DB) Driver() driver.Driver
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
func (db *DB) Prepare(query string) (*Stmt, error)
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
func (db *DB) QueryRow(query string, args ...interface{}) *Row

Query && QueryRow

如下代码示例,

package main

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

func main() {

	//完整的数据库连接字符串
	//username:password@protocol(address)/dbname?param=value
	db, err := sql.Open("mysql", "root:034039@tcp(127.0.0.1:3306)/account")
	defer db.Close()

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

	rows, err := db.Query("SELECT vin,no FROM vehicle_gps where type= ?", 2)

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

	var vin, no string
	for rows.Next() {
		err := rows.Scan(&vin, &no) //获取字段,select几个字段就传入几个变量
		if err != nil {
			log.Println(err)
		}
		fmt.Println(vin, no)
	}

	// 查询单条记录
	singledRow := db.QueryRow("SELECT id,type FROM vehicle_gps where id = ?", 3901)
	var id, kind int
	singledRow.Scan(&id, &kind)
	fmt.Println(id, kind)
}

Exec

如下代码示例,

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"math/rand"
	"time"
)

func main() {

	//完整的数据库连接字符串
	//username:password@protocol(address)/dbname?param=value
	db, err := sql.Open("mysql", "root:034039@tcp(127.0.0.1:3306)/account")

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

	//在这里进行一些数据库操作
	defer db.Close()

	//db.Exec 执行查询
	//rand.Intn(100) 返回100 以内随机数
	rand.Seed(time.Now().Unix()) //设置随机数的种子
	random := rand.Intn(100)

	result, err := db.Exec("update vehicle_gps set type = ? where id = ?", random, 8033)
	if err != nil {
		fmt.Println("db.Exec error")
		log.Println(err)
	}
	n, _ := result.RowsAffected()
	fmt.Println(n)
}

Prepare

如下代码示例

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"math/rand"
	"time"
)

func main() {
	db, err := sql.Open("mysql", "root:034039@tcp(127.0.0.1:3306)/account")
	defer db.Close()

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

	stmt, err := db.Prepare("update vehicle_gps set type = ? where vin = ?")
	defer stmt.Close()

	if err != nil {
		log.Println(err)
	}
	//rand.Intn(10) 返回10 以内随机数
	rand.Seed(time.Now().Unix()) //设置随机数的种子
	random := rand.Intn(100)

	//Exec方法返回的是sql.Result对象
	result, err := stmt.Exec(random, "JM7CW09FXC0106372")

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

	rows, err := db.Query("select type from vehicle_gps where vin = ?", "JM7CW09FXC0106372")

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

	var t int
	for rows.Next() {
		rows.Scan(&t)
		fmt.Println(t)
		if t != random {
			panic("update type error")
		}
	}

	n, _ := result.RowsAffected()
	fmt.Println(n)
}

事务的支持

如下代码示例

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"math/rand"
	"time"
)

func main() {
	db, err := sql.Open("mysql", "root:034039@tcp(127.0.0.1:3306)/account")
	defer db.Close()

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

	tx, err := db.Begin() //开启一个事物
	defer tx.Commit()     //一定要commit

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

	stmt, err := tx.Prepare("update vehicle_gps set type = ? where vin = ?")
	defer stmt.Close()

	if err != nil {
		log.Println(err)
	}
	//rand.Intn(10) 返回10 以内随机数
	rand.Seed(time.Now().Unix()) //设置随机数的种子
	random := rand.Intn(100)
	result, err := stmt.Exec(random, "JM7CW09FXC0106372")

	if err != nil {
		log.Println(err)
	}
	fmt.Println(random)

	if n, _ := result.RowsAffected(); n == 2 {
		fmt.Println("rollback")
		tx.Rollback() //回滚事务后同时也要提交
	}
}

=========END=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 232
博文 574
码字总数 405033
作品 0
朝阳
程序员
Mysql使用binlog恢复数据解决误操作问题的两种方法

新搭建的个人博客,欢迎光临< 为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识 安装mysql5.6数据库 https://my.oschina.net/sgmder/blog/1631045 Mys...

Sgmder
03/07
0
0
MySQL 主从复制与读写分离概念及架构分析

1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端...

摩西
2016/10/27
8
0
MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库

MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库 Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDE...

xiaocao13140
06/06
0
0
CentOS LAMP环境配置好后,拒绝访问远程服务器

当LAMP环境配置好后,我们在本机:192.168.0.130使用Navicat连接服务器:192.168.0.168的时候会出现远程MySQL不允许访问的错误,这是因为Mysql为了安全性,在默认情况下用户只允许在本地登录...

cheng-git
2015/09/06
46
0
CentOS 配置MySQL允许远程登录

Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一、允许root用户在任何地方进行远程登录,...

Surjur
2014/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nexus Repository Manager 搭建私有docker仓库

Nexus Repository Manager 搭建私有docker仓库 2018年05月08日 14:44:23 阅读数:115 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d --name n...

linjin200
8分钟前
0
0
大数据技术的发展趋势

大数据领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。这些技术下一步将如何发展?它们之中哪些技术 将广为流行?又会诞生哪些新的技术? 技术趋向多样化,...

董黎明
11分钟前
1
0
谷歌浏览器插件入门示例

实现:任何网址实现图片下载和获取当前域名的cookies的json字符串。 图片下载是给小白用的,可以选中批量下载,获取cookies 是为了方便程序员调试用。 获取cookies: git地址: https://gite...

NLGBZJ
12分钟前
2
0
152. Maximum Product Subarray - LeetCode

Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的,这个问题要注意正负,需要...

yysue
13分钟前
0
0
IDEA工具 jdk,tomcat,maven 配置

设置JDK、tomcat、maven的版本 一、JDK      如果下拉列表没有,SDKS ---> + ----> 选择下载的JDK目录 ---> APPLY OK    二、tomcat 三、Maven    四、生成 git 本地创库...

君千殇520
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部