golang之数据库操作
1.导入必要的包
import(
"database/sql"
_ "github.com/go-sql-driver/mysql" //使用此作为数据库驱动
)
2.相关操作
连接数据库
使用sql.Open()函数进行数据库的连接
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
//用户名:密码@tcp(127.0.0.1:3306)/你要连接的数据库
if err != nil {
panic(err)
}
defer db.Close()
//使用完毕后不要忘了关闭
package main
import(
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
)
func main(){
db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")//db是 *sql.DB 使用Open函数打开目标的IP的指定数据库
if err !=nil {
fmt.Println("open error")
return
}
fmt.Printf("type is %T\n",db)
err = db.Ping()//Ping一下 看是否真的连接成功
if err != nil {
panic(err)
}
fmt.Println("Connected to database!")
defer db.Close()
}
运行可能出现如下错误:说明数据库拒绝访问,需要使用mysql_native_password
插件。
解决上面问题执行如下SQL语句:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY yourpass;
//上面输入你的密码
FLUSH PRIVILEGES;
SQL查询
先执行如下SQL语句创建表和填入方法
create table user ( uid int primary key auto_increment,
name varchar(20) default '',
phone varchar(20) default '') engine=innodb;
insert into user(name,phone) values('a','111'),('b','222'),('c','333');
1).使用QueryRow()方法进行单行查询
func (db* DB) QueryRow(query string,args ...interface{}) *Row
此方法执行一次 最多只能返回一行数据 并且直到返回值的Scan()方法被调用后才会返回
被延迟的错误,不推荐使用
package main
import(
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
)
type User struct {
Uid int
Name string
Phone string
}
func main(){
db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")
if err !=nil {
fmt.Println("open error")
return
}
fmt.Printf("type is %T\n",db)
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("Connected to database!")
defer db.Close()
user1 :=User{}
err =db.QueryRow("select uid,name,phone from user where uid=2").Scan(&user1.Uid,&user1.Name,&user1.Phone)
if err !=nil {
fmt.Println("sql Query error")
return
}
fmt.Println(user1.Uid," ",user1.Name," ",user1.Phone)
}
2)Query()查询多行结果
user1 :=User{}
rows ,err :=db.Query("select uid,name,phone from user")//返回error和 *rows
if err !=nil {
fmt.Println("sql Query error")
return
}
defer rows.Close()//关闭ROWS 释放所有的数据库连接
//循环读取结果集中的数据 储存在结构体中
for rows.Next(){
err =rows.Scan(&user1.Uid,&user1.Name,&user1.Phone)
if err !=nil {
fmt.Println("Scan error")
return
}
fmt.Println(user1.Uid," ",user1.Name," ",user1.Phone)
}
3). db.Exec(sql string) (Result,error)可以进行表数据的增删改 .
result,err :=db.Exec("insert into user(name,phone) values('d','444')")//SQL中的字符串类型用单引号 函数执行返回(result,error)类型
if err !=nil {
fmt.Println("insert error")
return
}
lastInsertID, err := result.LastInsertId()//获得插入数据的主键部分
if err !=nil {
fmt.Println("get ID error")
return
}
fmt.Println("insert success, the id is ",lastInsertID)
//剩下的删和该是一样的
4)事务操作
begin()方法开启事务:func (db *DB) Begin() (*Tx,error)
Commint()提交事务: func (tx *Tx) commit () error
Rollback()回滚事务: func (tx *Tx) Rollback() error
package main
import(
"database/sql"
_ "github.com/go-sql-driver/mysql"
"fmt"
)
type User struct {
Uid int
Name string
Phone string
}
func main(){
db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")
if err !=nil {
return
}
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("Connected to database!")
defer db.Close()
tx, err :=db.Begin() //开启事务
if err!=nil {
if tx!=nil {
tx.Rollback()
}
fmt.Println("begin trans failed")
return
}
_,err1 :=tx.Exec("update user set name = 'ggg' where phone = '444'")
if err1 !=nil {
tx.Rollback()//执行失败 进行回滚事务
fmt.Println("sal update failed")
return
}
tx.Commit()//提交事务
fmt.Println("exec transaction success!")
}