首页 > 数据库 >golang连接操作mysql

golang连接操作mysql

时间:2023-01-29 14:35:24浏览次数:46  
标签:nil err fmt mysql db id golang Printf 连接

golang操作mysql

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

//定义一个全局db对象
var db *sql.DB

func initDB() (err error) {
    dsn := "user:password@tcp(172.xxx.102.xxx:3306)/go_db?charset=utf8mb4&parseTime=True"
    db, err = sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }

    // fmt.Printf("db=%v", db)
    // defer db.Close()
    err = db.Ping()
    if err != nil {
        fmt.Printf("connect db failed:%v", err)
        return
    }
    db.SetMaxIdleConns(10)
    db.SetMaxOpenConns(200)
    db.SetConnMaxLifetime(time.Second * 10)
    return
}

// func insert() {
//     s := "insert into info(name,age) values(?,?)"
//     r, err := db.Exec(s, "zhangsan", 22)
//     if err != nil {
//         fmt.Printf("err:%v\n", err)
//     } else {
//         i, _ := r.LastInsertId()
//         fmt.Printf("i:%v\n", i)
//     }
// }

// 插入数据
func insertRowDemo() {
    sqlStr := "insert into info(id,name, age) values (?,?,?)"
    ret, err := db.Exec(sqlStr, 3, "王五", 38)
    if err != nil {
        fmt.Printf("insert failed, err:%v\n", err)
        return
    }
    theID, err := ret.LastInsertId() // 新插入数据的id
    if err != nil {
        fmt.Printf("get lastinsert ID failed, err:%v\n", err)
        return
    }
    fmt.Printf("insert success, the id is %d.\n", theID)

}

type User struct {
    id   int
    name string
    age  int
}

func queryOneRow() {
    s := "select * from info where id = ?"
    var u User
    err := db.QueryRow(s, 1).Scan(&u.id, &u.name, &u.age)
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("u: %v\n", u)
    }
}

// 查询多条数据示例
func queryMultiRowDemo() {
    sqlStr := "select id, name, age from info where id > ?"
    rows, err := db.Query(sqlStr, 0)
    if err != nil {
        fmt.Printf("query failed, err:%v\n", err)
        return
    }
    // fmt.Printf("rows=%v", rows)
    // 非常重要:关闭rows释放持有的数据库链接
    defer rows.Close()

    // 循环读取结果集中的数据
    for rows.Next() {
        var u User
        err := rows.Scan(&u.id, &u.name, &u.age)
        if err != nil {
            fmt.Printf("scan failed, err:%v\n", err)
            return
        }
        fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
    }
}

func update() {
    s := "update info set name=? where id=?"
    r, err := db.Exec(s, "王二麻子", 3)
    if err != nil {
        fmt.Printf("err: %v\n", err)
        return
    }
    i, err2 := r.RowsAffected()
    if err2 != nil {
        fmt.Println("get afectd rows failed")
        return
    }
    fmt.Println("update success,afected rows:%d\n", i)
}

// 删除数据
func deleteRowDemo() {
    sqlStr := "delete from info where id = ?"
    ret, err := db.Exec(sqlStr, 3)
    if err != nil {
        fmt.Printf("delete failed, err:%v\n", err)
        return
    }
    n, err := ret.RowsAffected() // 操作影响的行数
    if err != nil {
        fmt.Printf("get RowsAffected failed, err:%v\n", err)
        return
    }
    fmt.Printf("delete success, affected rows:%d\n", n)
}

// ### sql预处理
//预处理插入
func prepareInsertDemo() {
    sqlStr := "insert into info(id,name,age) values(?,?,?)"
    s, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Printf("prepare failed,err:%v\n", err)
        return
    }
    defer s.Close()
    _, err2 := s.Exec(10, "小王子", 20)
    if err2 != nil {
        fmt.Printf("insert failed,err2:%v\n", err2)
        return
    }
    fmt.Println("insert success...")
}

//预处理查询
func prepareQueryDemo() {
    sqlStr := "select id,name,age from info where id > ?"
    s, err := db.Prepare(sqlStr)
    if err != nil {
        fmt.Println("prepare failed,err:%v\n", err)
        return
    }
    defer s.Close()
    r, err2 := s.Query(0)
    if err2 != nil {
        fmt.Printf("query failed,err:$%v\n", err2)
        return
    }
    defer r.Close()
    //循环读取结果
    for r.Next() {
        var u User
        err := r.Scan(&u.id, &u.name, &u.age)
        if err != nil {
            fmt.Printf("scan failed,err:%v\n", err)
            return
        }
        fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
    }
}

func main() {
    err := initDB() //调用初始化数据的函数
    if err != nil {
        fmt.Printf("init db failed,err:%v\n", err)
        return
    } else {
        fmt.Println("连接成功")
    }

    // insert()
    // insertRowDemo()
    // defer db.Close()
    // fmt.Println("===========")
    // queryOneRow()
    // queryMultiRowDemo()
    // update()
    // deleteRowDemo()
    // prepareInsertDemo()
    prepareQueryDemo()
}

 

标签:nil,err,fmt,mysql,db,id,golang,Printf,连接
From: https://www.cnblogs.com/wushaoyu/p/16519152.html

相关文章

  • linux-安装mysql
    1.在/use/local下mkdirmysql  2.切换到mysql文件夹下cdmysql  3.下载mysql wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-lin......
  • 3.远程连接、防火墙、关机
    1.ssh协议SecureShell,安全外壳协议,简称ssh,是一种建立在应用层基础上的安全协议,通过对密码进行加密传输验证,可在不安全的网络中对网络服务提供安全的传输环境,实现ssh客户......
  • mysql8.0 --mysqldump数据备份
     mysqldump数据,可以把用户名写在配置文件的[mysqldump]中但是这里只能写一个用户名和密码,如果一个数据库里有多个用户和数据库怎么分开备份。1、创建一个备份的用户test......
  • 关于Mysql中str_to_date函数
    Str_To_Date(str,format):提供2个参数,Str是字符串时间,年:月:日时:分:秒的值,format是设置什么日期格式的条件。一般都会自动写代码显示selectStr_To_Date(now(),'%Y-%m-%d......
  • 写了个"网络连接管理"软件,以后做这事情方便了
                                       支持Win2K,WinXp,Win2003,..'-------------------------------------------'作者:唐细刚'-----......
  • 电脑本地安装不同版本MySQL
    本地已经安装了mysql5.7版本,想测试mysql8版本的用法,想在一台电脑同时配置不同版本的mysql在不同端口号,看起来简单,实现起来其实挺多坑的,总结下实战经验和大家分享下......
  • 【Python视频下载】Python字符串连接的5种方法
    导读在使用Python的时候,经常会进行字符串操作,本文总结了一下Python字符串连接的5种方法,希望对大家有所帮助。1.加号第一种,有编程经验的人,估计都知道很多语言里面是用加号连......
  • 7.10 SQL Server全外连接查询
    SQLServerFullOuterJoin目录SQLServerFullOuterJoinSQLServer全外连接简介全连接示例SQLServer全外连接简介全外连接也称全连接,效果很像左连接和右连接的结合......
  • 7.11 SQL Server交叉连接
    SQLServerCrossJoin目录SQLServerCrossJoin交叉连接简介交叉连接简介语法:SELECT select_listFROM T1CROSSJOINT2;交叉连接将第一表(T1)的每一行与第二表(T2......
  • 7.12 SQL Server自连接
    SQLServerSelfJoin目录SQLServerSelfJoin简介自连接查询示例1)使用自连接查询层级数据2)使用自联接比较表中的行简介自连接将表连接到自身。它有助于查询层级数据或......