Go语言操作MySQL数据库

6 篇文章 0 订阅
1.安装
go get -u github.com/typa01/go-mysql-utils
go get -u github.com/typa01/go-utils
import (
	"github.com/typa01/go-mysql-utils"
)
2.创建数据库客户端
	var dbConfig tsgmysqlutils.DBConfig
	dbConfig.DbHost = "127.0.0.1"
	dbConfig.DbUser = "root"
	dbConfig.DbPass = "123456"
	dbConfig.IsLocalTime = true
	dbConfig.DbName = "test"
	client := tsgmysqlutils.NewDbClient(dbConfig)

3.GitHub源码地址
https://github.com/typa01/go-mysql-utils
https://github.com/typa01/go-mysql-utils/blob/master/mysql.go
4.客户端数据操作:建表,增删改查,聚合,批量插入(含事务)
此操作部分含有ORM操作,请参考: https://blog.csdn.net/typa01_kk/article/details/80144574
/*
	You must execute this SQL in your MySQL database:

	CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
*/

func TestCreateTable(t *testing.T) {

	client := TestDbClient()

	tabSql := tsgutils.NewStringBuilder()
	tabSql.Append("CREATE TABLE `we_test_tab1` (")
	tabSql.Append("`id` int(10) unsigned AUTO_INCREMENT NOT NULL COMMENT 'The primary key id',")
	tabSql.Append("`name` varchar(64) NOT NULL DEFAULT '' COMMENT 'The user name',")
	tabSql.Append("`gender` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'The user gerder, 1:male 2:female 0:default',")
	tabSql.Append("`birthday` date NOT NULL COMMENT 'The user birthday, eg: 2018-04-16',")
	tabSql.Append("`stature` decimal(16, 2) NOT NULL DEFAULT '0.00' COMMENT 'The user stature, eg: 172.22cm',")
	tabSql.Append("`weight` decimal(16, 2) NOT NULL DEFAULT '0.00' COMMENT 'The user weight, eg: 21.77kg',")
	tabSql.Append("`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',")
	tabSql.Append("`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'record time',")
	tabSql.Append("`is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Logic to delete(0:normal 1:deleted)',")
	tabSql.Append("PRIMARY KEY (`id`),")
	tabSql.Append("UNIQUE KEY `name` (`name`)")
	tabSql.Append(") ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE= utf8_bin COMMENT = 'test table1';")

	client.Exec(tabSql.ToString())

	tabSql = tabSql.Clear()
	tabSql.Append("CREATE TABLE `we_test_tab2` (")
	tabSql.Append("`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key id',")
	tabSql.Append("`user_id` int(10) unsigned NOT NULL COMMENT 'The user id',")
	tabSql.Append("`area_code` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'The user area code',")
	tabSql.Append("`phone` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'The user phone',")
	tabSql.Append("`email` varchar(35) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The user email',")
	tabSql.Append("`postcode` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'The user postcode',")
	tabSql.Append("`administration_code` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'The user administration code',")
	tabSql.Append("`address` varchar(150) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The user address',")
	tabSql.Append("`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',")
	tabSql.Append("`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified time',")
	tabSql.Append("`is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Logic to delete(0:normal 1:deleted)',")
	tabSql.Append("PRIMARY KEY (`id`)")
	tabSql.Append(") ENGINE =InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin COMMENT ='test table2';")

	_, err := client.Exec(tabSql.ToString())

	if err != nil {
		tsgutils.Stdout("TestCreateTable failed", err)
	} else {
		tsgutils.Stdout("we_test_tab1 and we_test_tab2 tables created.")
	}
	client.CloseConn()
}

func TestGenerateORM(t *testing.T) {
	client := TestDbClient()
	orm := NewORMGenerator(client)
	orm.AddComment = true
	tabNames := []string{"we_test_tab1", "we_test_tab2"}
	orm.DefaultGenerator(tabNames)
	client.CloseConn()
}

func TestInsertSQL(t *testing.T) {

	client := TestDbClient()

	sql := "INSERT INTO we_test_tab1(`name`,`gender`,`birthday`,`stature`,`weight`,`created_time`,`modified_time`,`is_deleted`) VALUES(?,?,?,?,?,?,?,?)"
	params := tsgutils.NewInterfaceBuilder()
	for i := 1; i < 6; i++ {
		params.Clear()
		name := tsgutils.NewStringBuilder().Append("可可").AppendInt(i).ToString()
		params.Append(name).Append(i%2 + 1)
		birthDayStr := tsgutils.NewStringBuilder().Append("199").AppendInt(i).Append("-0").AppendInt(i).Append("-0").AppendInt(i).ToString()
		birthDay, err := tsgutils.StringToTime(birthDayStr, 1)
		tsgutils.CheckAndPrintError("birthDay", err)
		curTime := time.Now()
		stature, err := tsgutils.NewString("17").AppendInt(i).AppendString(".3").AppendInt(i).ToFloat()
		tsgutils.CheckAndPrintError("stature", err)
		weight, err := tsgutils.NewString("4").AppendInt(i).AppendString(".1").AppendInt(i).ToFloat()
		tsgutils.CheckAndPrintError("weight", err)
		params.Append(birthDay).Append(stature).Append(weight)
		params.Append(curTime).Append(curTime).Append(0)

		result, err := client.Exec(sql, params.ToInterfaces()...)
		if err != nil {
			tsgutils.Stdout("Insert failed", err)
		} else {
			tsgutils.Stdout("Insert result: last insert id:", result)
		}
	}
	client.CloseConn()
}

func TestUpdateSQL(t *testing.T) {
	client := TestDbClient()

	sql := "UPDATE we_test_tab1 SET is_deleted = ?,modified_time=NOW() WHERE id > 3;"

	result, err := client.Exec(sql, 1)
	if err != nil {
		tsgutils.Stdout("Update failed", err)
	} else {
		tsgutils.Stdout("Update result: rows affected: ", result)
	}
	client.CloseConn()
}

func TestSelectSQL(t *testing.T) {
	client := TestDbClient()

	sql := "SELECT * FROM we_test_tab1 WHERE id = 1;"
	weTestTab1 := new(WeTestTab1)
	var orm ORMBase = weTestTab1
	_, err := client.QueryRow(orm, sql)
	if err != nil {
		tsgutils.Stdout("Select row failed", err)
	} else {
		tsgutils.Stdout("Select row result: ", tsgutils.StructToJson(weTestTab1))
	}
	client.CloseConn()
}

func TestSelectListSQL(t *testing.T) {
	client := TestDbClient()

	sql := "SELECT * FROM we_test_tab1 WHERE is_deleted <> 1;"
	weTestTab1 := new(WeTestTab1)
	var orm ORMBase = weTestTab1
	_, err := client.QueryList(orm, sql)
	if err != nil {
		tsgutils.Stdout("Select rows failed", err)
	} else {
		tsgutils.Stdout("Select rows result: ", tsgutils.StructToJson(weTestTab1.WeTestTab1s))
	}
	client.CloseConn()
}

func TestSelectAggregateSQL(t *testing.T) {
	client := TestDbClient()

	sql := "SELECT COUNT(*) FROM we_test_tab1 WHERE is_deleted <> 1;"

	result, err := client.QueryAggregate(sql)
	if err != nil {
		tsgutils.Stdout("Select aggregate failed", err)
	} else {
		tsgutils.Stdout("Select aggregate result: ", result)
	}
	client.CloseConn()
}

func TestDeleteSQL(t *testing.T) {
	client := TestDbClient()

	sql := "DELETE FROM we_test_tab1 WHERE id = ?;"

	result, err := client.Exec(sql, 5)
	if err != nil {
		tsgutils.Stdout("Delete failed", err)
	} else {
		tsgutils.Stdout("Delete result: rows affected: ", result)
	}
	client.CloseConn()
}

func TestDbTxSuccessful(t *testing.T) {
	client := TestDbClient()
	sql1 := "INSERT INTO `we_test_tab1` (`name`, `gender`, `birthday`, `stature`, `weight`, `created_time`, `modified_time`, `is_deleted`) VALUES('tony', 2, '1991-01-01', 171.31, 41.11, '2018-04-19 13:20:09', '2018-04-19 13:20:09', 0);"
	sql2 := "INSERT INTO `we_test_tab2` (`user_id`, `area_code`, `phone`, `email`, `postcode`, `administration_code`, `address`, `created_time`, `modified_time`, `is_deleted`) VALUES (?, 86, 18212345678, 'tony@timespace.group', 100089, 110108, '北京市海淀区中关村', '2018-04-21 08:39:14', '2018-04-21 08:39:14', 0);"
	tx, err := client.TxBegin()
	if err != nil {
		tsgutils.CheckAndPrintError("TxBegin failed", err)
		return
	}
	id1, err := client.TxExec(tx, sql1)
	if err != nil {
		client.TxRollback(tx)
		tsgutils.Stdout("TxRollback sql1", id1, err)
		return
	}
	id2, err := client.TxExec(tx, sql2, id1)
	if err != nil {
		client.TxRollback(tx)
		tsgutils.Stdout("TxRollback sql2", id2, err)
		return
	}
	if client.TxCommit(tx) {
		tsgutils.Stdout("TestDbTx Successful: ", id1, id2)
	} else {
		tsgutils.Stdout("TestDbTx TxCommit failed")
	}
	client.CloseConn()
}

func TestDbTxFailure(t *testing.T) {
	// The `we_test_tab2` primary key conflict: Duplicate entry '1' for key 'PRIMARY'
	client := TestDbClient()
	sql1 := "INSERT INTO `we_test_tab1` (`name`, `gender`, `birthday`, `stature`, `weight`, `created_time`, `modified_time`, `is_deleted`) VALUES('tian', 2, '1991-01-01', 171.31, 41.11, '2018-04-19 13:20:09', '2018-04-19 13:20:09', 0);"
	sql2 := "INSERT INTO `we_test_tab2` (`id`,`user_id`, `area_code`, `phone`, `email`, `postcode`, `administration_code`, `address`, `created_time`, `modified_time`, `is_deleted`) VALUES (1, ?, 86, 18212345678, 'tony@timespace.group', 100089, 110108, '北京市海淀区中关村', '2018-04-21 08:39:14', '2018-04-21 08:39:14', 0);"
	tx, err := client.TxBegin()
	if err != nil {
		tsgutils.CheckAndPrintError("TxBegin failed", err)
		return
	}
	id1, err := client.TxExec(tx, sql1)
	if err != nil {
		client.TxRollback(tx)
		tsgutils.Stdout("TxRollback sql1", id1, err)
		return
	}
	id2, err := client.TxExec(tx, sql2, id1)
	if err != nil {
		client.TxRollback(tx)
		tsgutils.Stdout("TxRollback sql2", id2, err)
		return
	}
	if client.TxCommit(tx) {
		tsgutils.Stdout("TestDbTx Successful: ", id1, id2)
	} else {
		tsgutils.Stdout("TestDbTx TxCommit failed")
	}
	client.CloseConn()
}

func TestGenerateORM_Insert_true(t *testing.T) {
	client := TestDbClient()
	weTestTab1 := new(WeTestTab1)
	weTestTab1.Id = 7
	weTestTab1.Name = "tina"
	weTestTab1.Gender = 1
	weTestTab1.Birthday = time.Now()
	weTestTab1.Stature = 60.12
	weTestTab1.Weight = 178.34
	weTestTab1.CreatedTime = time.Now()
	weTestTab1.ModifiedTime = time.Now()
	weTestTab1.IsDeleted = 0
	result, err := weTestTab1.Insert(client, true)
	if err != nil {
		tsgutils.Stdout("Update failed", err)
	} else {
		tsgutils.Stdout("Update orm result: rows affected: ", result)
	}
}

func TestGenerateORM_Insert_false(t *testing.T) {
	client := TestDbClient()
	weTestTab1 := new(WeTestTab1)
	weTestTab1.Name = "boss"
	weTestTab1.Gender = 1
	weTestTab1.Birthday = time.Now()
	weTestTab1.Stature = 60.23
	weTestTab1.Weight = 178.45
	weTestTab1.CreatedTime = time.Now()
	weTestTab1.ModifiedTime = time.Now()
	weTestTab1.IsDeleted = 0
	result, err := weTestTab1.Insert(client, false)
	if err != nil {
		tsgutils.Stdout("Update failed", err)
	} else {
		tsgutils.Stdout("Update orm result: last insert id: ", result)
	}
	client.CloseConn()
}

func TestGenerateORM_BatchInsert_returnIds_false(t *testing.T) {
	client := TestDbClient()
	weTestTab1s := new(WeTestTab1)
	for i := 0; i < 3; i++ {
		var weTestTab1 WeTestTab1
		weTestTab1.Name = tsgutils.NewString("Tony").AppendInt(i).ToString()
		weTestTab1.Gender = 1
		weTestTab1.Birthday = time.Now()
		weTestTab1.Stature = 60.88
		weTestTab1.Weight = 178.55
		weTestTab1.CreatedTime = time.Now()
		weTestTab1.ModifiedTime = time.Now()
		weTestTab1.IsDeleted = 0
		weTestTab1s.WeTestTab1s = append(weTestTab1s.WeTestTab1s, weTestTab1)
	}
	result, err := weTestTab1s.BatchInsert(client, false, false)
	if err != nil {
		tsgutils.Stdout("BatchInsert failed", err)
	} else {
		tsgutils.Stdout("BatchInsert orm result: last insert id: ", tsgutils.StructToJson(result))
	}
	client.CloseConn()
}

func TestGenerateORM_BatchInsert_returnIds_true(t *testing.T) {
	client := TestDbClient()
	weTestTab1s := new(WeTestTab1)
	for i := 100; i < 103; i++ {
		var weTestTab1 WeTestTab1
		weTestTab1.Id = int64(i)
		weTestTab1.Name = tsgutils.NewString("Tony").AppendInt64(weTestTab1.Id).ToString()
		weTestTab1.Gender = 1
		weTestTab1.Birthday = time.Now()
		weTestTab1.Stature = 60.99
		weTestTab1.Weight = 178.66
		weTestTab1.CreatedTime = time.Now()
		weTestTab1.ModifiedTime = time.Now()
		weTestTab1.IsDeleted = 0
		weTestTab1s.WeTestTab1s = append(weTestTab1s.WeTestTab1s, weTestTab1)
	}
	result, err := weTestTab1s.BatchInsert(client, true, true)
	if err != nil {
		tsgutils.Stdout("BatchInsert failed", err)
	} else {
		tsgutils.Stdout("BatchInsert orm result: last insert id: ", tsgutils.StructToJson(result))
		tsgutils.Stdout("BatchInsert orm result: inner last insert id: ", weTestTab1s.WeTestTab1s[0].Id)
	}
	client.CloseConn()
}

func TestGenerateORM_Update(t *testing.T) {
	client := TestDbClient()
	weTestTab1 := new(WeTestTab1)
	var orm ORMBase = weTestTab1
	sql := "SELECT * FROM we_test_tab1 WHERE id = 3;"
	client.QueryRow(orm, sql)
	weTestTab1.Name = "可可^_^"
	result, err := weTestTab1.UpdateWeTestTab1ById(client)
	if err != nil {
		tsgutils.Stdout("Update failed", err)
	} else {
		tsgutils.Stdout("Update orm result: rows affected: ", result)
	}
	client.CloseConn()
}

func TestGenerateORM_Delete(t *testing.T) {
	client := TestDbClient()
	weTestTab1 := new(WeTestTab1)
	weTestTab1.Id = 4
	result, err := weTestTab1.DeleteWeTestTab1ById(client)
	if err != nil {
		tsgutils.Stdout("Delete failed", err)
	} else {
		tsgutils.Stdout("Delete orm result: rows affected: ", result)
	}
	client.CloseConn()
}

func TestTxQuery1(t *testing.T) {
	client := TestDbClient()
	sql := "SELECT name FROM we_test_tab1 WHERE id = 1 FOR UPDATE;"
	tx, _ := client.TxBegin()
	stmt, _ := tx.Prepare(sql)
	row := stmt.QueryRow()
	var name string
	row.Scan(&name)
	tsgutils.Stdout(name)
	client.TxCommit(tx)
	client.CloseConn()
}

func TestTxQuery2(t *testing.T) {
	client := TestDbClient()
	sql := "SELECT name FROM we_test_tab1 WHERE id = ? FOR UPDATE;"
	tx, _ := client.TxBegin()
	row, _ := client.TxQueryRow(tx, nil, sql, 1)
	var name string
	row.Scan(&name)
	tsgutils.Stdout(name)
	client.TxCommit(tx)
	client.CloseConn()
}

func TestPrintLog(t *testing.T) {
	driverName := MySQL
	PrintSlowConn(driverName, "127.0.0.1", "mysql", 5000)
	sql := "SELECT * FROM user WHERE User = ? AND Host = ?"
	params := []interface{}{"root", "127.0.0.1"}
	PrintSlowSql("127.0.0.1", "mysql", 5000, sql, params)
	err := errors.New("test sql error")
	PrintErrorSql(err, sql, params)
}
4.附录:sql语句
CREATE TABLE `we_test_tab1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key id',
  `name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The user name',
  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'The user gerder, 1:male 2:female 0:default',
  `birthday` date NOT NULL COMMENT 'The user birthday, eg: 2018-04-16',
  `stature` decimal(16,2) NOT NULL DEFAULT '0.00' COMMENT 'The user stature, eg: 172.22cm',
  `weight` decimal(16,2) NOT NULL DEFAULT '0.00' COMMENT 'The user weight, eg: 21.77kg',
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',
  `modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'record time',
  `is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Logic to delete(0:normal 1:deleted)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='test table1';

CREATE TABLE `we_test_tab2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'The primary key id',
  `user_id` int(10) unsigned NOT NULL COMMENT 'The user id',
  `area_code` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'The user area code',
  `phone` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'The user phone',
  `email` varchar(35) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The user email',
  `postcode` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'The user postcode',
  `administration_code` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'The user administration code',
  `address` varchar(150) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The user address',
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',
  `modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified time',
  `is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Logic to delete(0:normal 1:deleted)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='test table2';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值