Go连接数据库

Go连接数据库

1 MySQL

1.1 准备

1.1.1 下载包
go get -u github.com/go-sql-driver/mysql

1.1.2 使用

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

db, err := sql.Open("mysql", "user:password@/dbname")

1.1.3 数据源连接名

username:password@protocol(address)/dbname?param=value

1.1.4 实战连接

package main

import (
	"database/sql"
	"fmt"
	// 记得一定要导这个包
	_ "github.com/go-sql-driver/mysql"
)

func main()  {
	driverName := "root:123456@tcp(127.0.0.1:3306)/mybatis-plus?charset=utf8"
	db, er := sql.Open("mysql", driverName)
	if er != nil {
		fmt.Println(er)
		fmt.Print("连接错误")
		return
	}
	fmt.Print("连接到数据库...	")
	db.Close()
}

记得导包:_ "github.com/go-sql-driver/mysql",否则会报错sql: unknown driver "mysql" (forgotten import?),这里导包时用的_表示只执行包中的init方法。

1.2 操作数据库

下面是准备的数据库表:

create table user
(
    id    bigint auto_increment comment '主键ID' primary key,
    name  varchar(30) null comment '姓名',
    age   int         null comment '年龄',
    email varchar(50) null comment '邮箱'
);
1.2.1 增
package main

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

func main()  {
	driverName := "root:123456@tcp(127.0.0.1:3306)/mybatis-plus?charset=utf8"
	db, er := sql.Open("mysql", driverName)
	if er != nil {
		fmt.Println(er)
		fmt.Print("连接错误")
		return
	}
	// 关闭数据库连接
	defer db.Close()
	defer fmt.Println("数据库连接已关闭!")
	fmt.Println("连接到数据库...	")
	insert(db);
}

// 增
func insert(db *sql.DB)  {
	// 执行sql预编译
	stmt, _ := db.Prepare("INSERT INTO `user` SET `name` = ?, `age` = ?, `email` = ?")

	res, _ := stmt.Exec("小红", 18, "xiaoming@qq.com")
	id, _ := res.LastInsertId()
	// 关闭
	defer stmt.Close()
	affected, _ := res.RowsAffected()
	fmt.Printf("插入的数据的id是%d,受影响的行数是%d \n ", id, affected)
}

先使用db.Prepare预编译sql并所加stmt,再调用stmt.Exec执行sql,通过执行sql返回的结果获取数据!
搬入数据的返回结果是如下结构体,其中LastInsertId()可以获取插入数据后的idRowsAffected()可以获取影响的数据行数。

type Result interface {
	LastInsertId() (int64, error)
	RowsAffected() (int64, error)
}
1.2.2 删
func delete(db *sql.DB) {
	stmt, _ := db.Prepare("delete from `user` where id = ?")
	res, _ := stmt.Exec(1)
	affected, _ := res.RowsAffected()
	fmt.Printf("影响行数:%d", affected)
	defer smt.close()
}
1.2.3 改
func update(db *sql.DB) {
	smt, _ := db.Prepare("update `user` set age = 20 where `id` = ?")
	res, _ := smt.Exec(1)
	affected, _ := res.RowsAffected()
	fmt.Printf("影响行数:%d,插入数据ID:%d", affected)
	defer smt.close()
}
1.2.4 查

这里要注意的是,如果是查的所有字段,再Scan时就要用对应的所有字段去接受,也就是说查询几个字段就必须用几个变量来接受这几个值。


func query(db *sql.DB)  {
	rows, _ := db.Query("select id, name, email from `user` where id = 1")
	for rows.Next()  {
		var id int
		var name string
		var email string
		// 取出每一条数据
		err := rows.Scan(&id, &name, &email)
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("id: %d\t姓名: %s\t邮箱: %s", id, name, email)
	}
	// 要关闭rows
	defer rows.Close()
}

预编译带占位符查询:

func query1(db sql.DB) {
	stmt, _ := db.Prepare("select * from `user` where id = ?")
	rows, _ := stmt.Query(1)
	for rows.Next()  {
		var id int
		var name string
		var email string
		var age int 
		// 取出每一条数据
		err := rows.Scan(&id, &name, &email, &age)
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("id: %d\t姓名: %s\t年龄: %d\t 邮箱:%s", id, name, age, email)
	}
defer	stmt.close()
defer	rows.close
}

1.3 事务

func tx(db *sql.DB)  {
	tx, _ := db.Begin()
	stmt, _ := tx.Prepare("delete from `user` where id = ?")
	res, _ := stmt.Exec(5)
	fmt.Println(res.RowsAffected())
	defer stmt.Close()
	tx.Rollback()
}

首先调用db.Begin()开启事务,并返回一个sql.Tx对象,再通过这个对象来操作数据库,数据库操作成功后通过调用这个对象的Commit()或者Rollback()方法实现十五的提交或回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值