自学内容网 自学内容网

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!")
}


原文地址:https://blog.csdn.net/2301_80090730/article/details/145084437

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!