zoukankan      html  css  js  c++  java
  • Go操作MySQL总结

    1.下载驱动包

    打开GoLand—>Terminal,输入:go get github.com/go-sql-driver/mysql

    2.编写代码

    package main

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

    //数据库连接信息
    const (
    USERNAME = "root"
    PASSWORD = "123456"
    NETWORK = "tcp"
    SERVER = "localhost"
    PORT = 3306
    DATABASE = "test"
    )

    //user表结构体定义
    type User struct {
    Id int `json:"id" form:"id"`
    Username string `json:"username" form:"username"`
    Password string `json:"password" form:"password"`
    Status int `json:"status" form:"status"` // 0 正常状态, 1删除
    Createtime int64 `json:"createtime" form:"createtime"`
    }

    func main() {
    conn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)
    DB, err := sql.Open("mysql", conn)
    if err != nil {
    fmt.Println("connection to mysql failed:", err)
    return
    }

    DB.SetConnMaxLifetime(100 * time.Second) //最大连接周期,超时的连接就close
    DB.SetMaxOpenConns(100) //设置最大连接数
    CreateTable(DB)
    InsertData(DB)
    QueryOne(DB)
    QueryMulti(DB)
    UpdateData(DB)
    DeleteData(DB)
    }

    //创建表
    func CreateTable(DB *sql.DB) {
    sql := `CREATE TABLE IF NOT EXISTS users(
    id INT(4) PRIMARY KEY AUTO_INCREMENT NOT NULL,
    username VARCHAR(64),
    password VARCHAR(64),
    status INT(4),
    createtime INT(10)
    ); `

    if _, err := DB.Exec(sql); err != nil {
    fmt.Println("create table failed:", err)
    return
    }
    fmt.Println("create table successd")
    }

    //添加数据
    func InsertData(DB *sql.DB) {
    result, err := DB.Exec("insert INTO users(username,password) values(?,?)", "test", "123456")
    if err != nil {
    fmt.Printf("Insert data failed,err:%v", err)
    return
    }
    lastInsertID, err := result.LastInsertId() //获取插入数据的自增ID
    if err != nil {
    fmt.Printf("Get insert id failed,err:%v", err)
    return
    }
    fmt.Println("Insert data id:", lastInsertID)

    rowsaffected, err := result.RowsAffected() //通过RowsAffected获取受影响的行数
    if err != nil {
    fmt.Printf("Get RowsAffected failed,err:%v", err)
    return
    }
    fmt.Println("Affected rows:", rowsaffected)
    }

    //查询单行
    func QueryOne(DB *sql.DB) {
    user := new(User) //用new()函数初始化一个结构体对象
    row := DB.QueryRow("select id,username,password from users where id=?", 2)
    //row.scan中的字段必须是按照数据库存入字段的顺序,否则报错
    if err := row.Scan(&user.Id, &user.Username, &user.Password); err != nil {
    fmt.Printf("scan failed, err:%v ", err)
    return
    }
    fmt.Println("Single row data:", *user)
    }

    //查询多行
    func QueryMulti(DB *sql.DB) {
    user := new(User)
    rows, err := DB.Query("select id,username,password from users where id = ?", 2)

    defer func() {
    if rows != nil {
    rows.Close() //关闭掉未scan的sql连接
    }
    }()
    if err != nil {
    fmt.Printf("Query failed,err:%v ", err)
    return
    }
    for rows.Next() {
    err = rows.Scan(&user.Id, &user.Username, &user.Password) //不scan会导致连接不释放
    if err != nil {
    fmt.Printf("Scan failed,err:%v ", err)
    return
    }
    fmt.Println("scan successd:", *user)
    }
    }

    //更新数据
    func UpdateData(DB *sql.DB) {
    result, err := DB.Exec("UPDATE users set password=? where id=?", "111111", 3)
    if err != nil {
    fmt.Printf("Insert failed,err:%v ", err)
    return
    }
    fmt.Println("update data successd:", result)

    rowsaffected, err := result.RowsAffected()
    if err != nil {
    fmt.Printf("Get RowsAffected failed,err:%v ", err)
    return
    }
    fmt.Println("Affected rows:", rowsaffected)
    }

    //删除数据
    func DeleteData(DB *sql.DB) {
    result, err := DB.Exec("delete from users where id=?", 2)
    if err != nil {
    fmt.Printf("Insert failed,err:%v ", err)
    return
    }
    fmt.Println("delete data successd:", result)

    rowsaffected, err := result.RowsAffected()
    if err != nil {
    fmt.Printf("Get RowsAffected failed,err:%v ", err)
    return
    }
    fmt.Println("Affected rows:", rowsaffected)
    }
  • 相关阅读:
    RTMP协议安防视频直播点播平台EasyDSS点播目录绑定用户接口无响应问题排查
    RTMP协议安防视频平台EasyDSS在Linux下运行提示-bash .start.sh Permission denied问题解决
    RTMP协议视频直播点播平台EasyDSS内Go语言使用反射优化代码技巧说明
    IP摄像头RTMP协议互联网直播点播平台EasyDSS配置录像/直播计划无法生效是什么原因?
    将IP网络摄像头通过RTMP协议推送到视频直播点播平台EasyDSS时,如何通过抓包RTMP协议保存视频流为H264文件
    hdu2795 Billboard 线段树
    hdu1394 Minimum Inversion Number 线段树和树状数组
    poj 3468 A Simple Problem with Integers 线段树
    CF round #292 解题报告
    棋盘问题 poj1321
  • 原文地址:https://www.cnblogs.com/wanyuan/p/11837402.html
Copyright © 2011-2022 走看看