当前位置: 首页 > article >正文

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


http://www.kler.cn/a/503513.html

相关文章:

  • 数仓建模(五)选择数仓技术栈:Hive ClickHouse 其它
  • Kylin: `GLIBC_2.34‘ not found
  • 【Elasticsearch复合查询】
  • Vue2+OpenLayers调用WMTS服务初始化天地图示例(提供Gitee源码)
  • 【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
  • Vue学习二——创建登录页面
  • ctf竞赛
  • VirtualBox环境中vscode报错:提取扩展时出错。Failed to fetch
  • Steam个人开发者注册备记
  • 解锁未来情感科技:AI 机器人 Ropet 搭载的前沿智能黑科技
  • K8s数据存储之详解(Detailed Explanation of K8s Data Storage)
  • 【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通
  • latex 中不要求显示页码
  • (一)QSQLite3库简介
  • 平台介绍-快速开发上手指南
  • 快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力
  • MCANet: 基于多模态字幕感知的大语言模型训练无关视频异常检测
  • 【向量数据库 Milvus】centos8源码安装和部署 Milvus 2.5.3
  • 惯性动作捕捉设备制作动画:打破传统动画制作模式,提高动画制作效率
  • Python 标准库:time——时间的访问和转换
  • MySQL社区版下载及其环境配置(msi)
  • 嵌入式Linux之基于TCP协议的程序
  • 配置Allure环境变量【macOS版】
  • 麒麟系统设置tomcat开机自启动
  • Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例
  • 【Ubuntu与Linux操作系统:二、图形界面与命令行】