go操作Mysql(不用gorm)

249 阅读2分钟

go操作数据库上网查了下基本都是用gorm,gorm对于新手感觉不是很好上手,还是直接操作SQL语句更容易一些。

这篇文章是使用“go-sql-driver/mysql”操作Mysql数据库的。

Go Mysql驱动是完全实现了database/sql/driver定义的接口,只导入这个包即可。

链接数据库

package main

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

func main() {
	db, err := sql.Open("mysql", "root:linan432@tcp(127.0.0.1)/links")
	defer db.Close()
	if err != nil{
		panic(err)
	}
	if err:= db.Ping(); err != nil{
		panic(err)
	}
}

使用sql.Open方法创建一个Mysql链接,该方法并不会立刻链接Mysql,它会在第一个查询时才会去了解数据库,所以Open方法没有返回错误并不代表数据库可用。

如果需要验证数据库是否可以用,需要调用Ping、PingContext方法。

第一个参数传入驱动的名称,“mysql”

第二个参数传入数据库的相关信息:"用户名:密码:协议名(数据库地址)/数据库名"

执行SQL语句

Exec(),更新、插入、删除

result, err := db.Exec("INSERT INTO test VALUES(NULL,'test',0)")
	if err != nil{
		panic(err)
	}
	lastId, err := result.LastInsertId()
	if err != nil{
		panic(err)
	}
	fmt.Printf("LastId is %d",lastId)

Exec方返回两个值,result、error。该方法适用于更新、删除、插入的SQL语言。

result有两个方法:

  • LastInsertId() (int64, error):返回插入的主键Id的值
  • RowsAffected() (int64, error):返回插入、删除、更新所影响的行数

Query() 查询

Query方法返回两个值,Rows、error。

Rows是存储查询结果的类型。调用Rows的next方法获取所有数据。Scan方法获取行里字段的值。

rows, err := db.Query("SELECT tid,tname  FROM tags")
	if err != nil{
		panic(err)
	}
	defer rows.Close()
	//
	for rows.Next(){
		var tname string
		var tid int
		//把该行的tname字段值存入tname变量
		err := rows.Scan(&tid,&tname)
		if err != nil{
			panic(err)
		}
		fmt.Println(tid,tname)
	}

使用事物

调用Begin方法,返回Tx,error。

	tx, err := db.Begin()
	if err != nil{
		panic(err)
	}
	result, err := tx.Exec("UPDATE tags set tname='tx' WHERE tid=?", 20)
	if err != nil{
		panic(err)
	}
	if rows,err := result.RowsAffected(); err != nil{
		fmt.Println("success")
		tx.Commit()
	}else{
		fmt.Println(rows,err)
		tx.Rollback()
	}