追枫狼

导航

golang操作数据库

  在golang中操作非关系型数据库(redis)和关系型数据库(mysql、oracle)。

  首先是下载数据库驱动包,因为墙的缘故,可能下载驱动包会有超时连接失败的情况,可以将镜像站点设为国内知名站点

  阿里云站点:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/

  GitHub国内镜像:

go env -w GOPROXY=https://goproxy.io,direct

  操作redis:

  下载驱动包

go get -u github.com/gomodule/redigo/redis

  开启redis服务端,代码里导入redis依赖即可,代码示例:

package main

import (
	"fmt"
	"github.com/gomodule/redigo/redis"
)

var pool *redis.Pool

func init() {
	pool = &redis.Pool{
		MaxIdle:     8,
		MaxActive:   0,
		IdleTimeout: 100,
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", "localhost:6379")
		},
	}
}

func main() {
	conn := pool.Get()
	defer conn.Close()

	_, err := conn.Do("MSet", "name", "stu", "hobby", "coding")
	if err != nil {
		panic(err)
	}

	s, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		panic(err)
	}
	_, err = conn.Do("del", "name")
	if err != nil {
		panic(err)
	}
	fmt.Println(s)
}

  操作mysql

  下载驱动包

go get -u github.com/go-sql-driver/mysql

  同样导入依赖即可,代码示例

package main

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

func main() {
	open, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/zt?parseTime=true")
	if err != nil {
		panic(err)
	}

	defer open.Close()

	query, err := open.Query("select id,user_id,depart_id,tenant_id from zt.base_depart_user")
	if err != nil {
		panic(err)
	}
	fmt.Println(query)

	for query.Next() {
		var id string
		var userId sql.NullString
		var departId sql.NullString
		var tenantId string
		err := query.Scan(&id,&userId,&departId,&tenantId)
		if err != nil {
			panic(err)
		}
		fmt.Printf("id=%v  userId=%v departId=%v  tenantId=%v \n", id, userId, departId, tenantId)
	}
	query.Close()
}

  操作oracle,驱动使用godror,同时需要注意的是oracle的占位符是“:name”的形式

  下载驱动包

go get github.com/godror/godror
db, err := sql.Open("godror", "DJJGK/DJJGK@172.xx.xx.xx:1521/orcl")
if err != nil {
	panic(err)
}

defer db.Close()

  事务

func (db *DB) Begin() (*Tx, error)
//开启事务tx,若后续任何操作有出错,则回滚
    tx, err := db.Begin()
    if err != nil {
        panic(err)
    }
    sql := "UPDATE table SET name=x WHERE id=10"
    stmt, err := tx.Prepare(sql)
    defer stmt.Close()
    if err != nil {
        tx.Rollback() //回滚
        panic(err)
    }
    _, err = stmt.Exec(x, 10)
    if err != nil {
        tx.Rollback() //回滚
        panic(err)
    }
    tx.Commit() //提交

  

posted on 2021-07-06 08:39  追枫狼  阅读(425)  评论(0编辑  收藏  举报