goMySQL批量_GO操作MYSQL 驱动包
MySql驱动
Go语⾔中的database/sql包不包含数据库驱动,使⽤时必须注⼊⼀个数据库驱动。
下载依赖
go get -u github/go-sql-driver/mysql
使⽤mysql驱动
语法:
func Open(driverName, dataSourceName string) (*DB, error)
⽰例代码:
import (
"database/sql"
"fmt"
_ "github/go-sql-driver/mysql"
)
func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/go_test"
//Open打开⼀个dirverName指定的数据库,dataSourceName指定数据源
db,err := sql.Open("mysql",dsn)
if err != nil{
fmt.Println("打开数据库失败,err:%v\n",err)
return
}
/
/Open函数可能只是验证其参数,Ping⽅法可检查数据源名称是否合法。
err = db.Ping()
if err != nil{
fmt.Println("连接数据库失败,err:%v\n",err)
return
}
fmt.Println("连接数据库成功!")
}
初始化连接
返回的DB可以安全的被多个goroutine同时使⽤,并会维护⾃⾝的闲置连接池。
import (
"database/sql"
"fmt"
_ "github/go-sql-driver/mysql"
)
//定义⼀个全局对象db
var db *sql.DB
//定义⼀个初始化数据库的函数
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/go_test" db,err := sql.Open("mysql",dsn)
if err != nil{
return err
}
//尝试与数据库连接,校验dsn是否正确
err = db.Ping()
if err != nil{
fmt.Println("校验失败,err",err)
return err
}
// 设置最⼤连接数
DB.SetMaxOpenConns(50)
// 设置最⼤的空闲连接数
// DB.SetMaxIdleConns(20)
fmt.Println("连接数据库成功!")
return nil
}
func main() {
err := initDB()
if err != nil{
fmt.Println("init db失败,err",err)
return
}
}
其中sql.DB是⼀个数据库(操作)句柄,代表⼀个具有零到多个底层连接的连接池。它可以安全的被多个go程同时使⽤。database/sql包会⾃动创建和释放连接;它也会维护⼀个闲置连接的连接池。
SetMaxOpenConns
语法:
func (db *DB) SetMaxOpenConns(n int)
DB.SetMaxOpenConns(10)
SetMaxOpenConns设置与数据库建⽴连接的最⼤数⽬。 如果n⼤于0且⼩于最⼤闲置连接数,会将最⼤闲置连接数减⼩到匹配最⼤开启连接数的限制。 如果n<=0,不会限制最⼤开启连接数,默认为0(⽆限制)。
SetMaxIdleConns
语法:
func (db *DB) SetMaxIdleConns(n int)
DB.SetMaxIdleConns(5)
SetMaxIdleConns设置连接池中的最⼤闲置连接数。 如果n⼤于最⼤开启连接数,则新的最⼤闲置连
接数会减⼩到匹配最⼤开启连接数的限制。 如果n<=0,不会保留闲置连接。
GUID
建库建表语句
> CREATE DATABASE go_test;
> use go_test;
> CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT '',
`age` INT(11) DEFAULT '0',
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
查询
单⾏查询
单⾏查询db.QueryRow()执⾏⼀次查询,并期望返回最多⼀⾏结果(即Row)。
语法:
func (db *DB) QueryRow(query string, args ...interface{}) *Row
⽰例:
import (
"database/sql"
"fmt"
_ "github/go-sql-driver/mysql"
)
/
/定义⼀个user结构体
type User struct {
id int64
name sql.NullString
age sql.NullInt64
}
//定义⼀个全局对象db
var DB *sql.DB
//定义⼀个初始化数据库的函数
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/go_test"
DB, err = sql.Open("mysql", dsn)
if err != nil{
return err
下载mysql服务端命令}
//尝试与数据库连接,校验dsn是否正确
err = DB.Ping()
if err != nil{
fmt.Println("校验失败,err",err)
return err
}
fmt.Println("连接数据库成功!")
return nil
}
// 单⾏查询
func queryRow() {
sqlStr := "select id,name,age from user where id=?"
var user User
err := DB.QueryRow(sqlStr,1).Scan(&user.id, &user.name, &user.age) if err != nil{
fmt.Println("scan失败,err",err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", user.id, user.name, user.age)
}
func main() {
err := initDB()
if err != nil{
fmt.Println("init db失败,err",err)
return
}
queryRow()
}
多⾏查询
多⾏查询db.Query()执⾏⼀次查询,返回多⾏结果(即Rows)。
语法:
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)⽰例:
//多⾏查询
func queryRows() {
sqlStr := "select id,name,age from user where id>?"
rows,err := DB.Query(sqlStr,0)
if err != nil{
fmt.Println("查询失败,err",err)
return
}
defer rows.Close() //关闭连接
/
/循环读取数据
for rows.Next(){
var user User
err := rows.Scan(&user.id,&user.name,&user.age)
if err != nil{
fmt.Println("scan失败,err",err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", user.id, user.name, user.age) }
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论