go语言开发基础46 - 之go语言操作MySQL数据库

一、MySQL介绍

MySQL属于传统开源的关系型数据库产品,其开放式的架构使得用户的选择性很强,而且随着技术的逐渐成熟,MySQL支持的功能也越来越多,性能也在不断地提高,对平台的支持也在增多,此外,社区的开发与维护人数也很多。当下,MySQL因为其功能稳定、性能卓越,且在遵守GPL协议的前提下,可以免费使用与修改,因此深受用户喜爱。
关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有的数据统一放在一个大仓库里,这样的设计加快了MySQL的读取速度,而且它的灵活性和可管理性也得到了很大的提高。访问及管理MySQL数据库的最常用标准化语言为SQL——结构化查询语言。SQL使得对数据库进行存储、更新和存取信息的操作变得更加容易。

 

二、go语言连接并操作MySQL数据库实例

2.1、准备工作

1.安装MySQL请参考:https://www.cnblogs.com/hei-ma/p/9505509.html

2、创建go_dev库

create database go_dev default charset utf8;

3、创建下面操作中用到的表

use go_dev;

CREATE TABLE go_dev_person (
    user_id int NOT NULL auto_increment primary key,
    username char(12) NOT NULL COMMENT '用户名',
    sex char(3) NOT NULL COMMENT '性别',
    email varchar(20) NOT NULL COMMENT '邮箱'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

CREATE TABLE go_dev_place (
    place_id int NOT NULL auto_increment primary key,
    country char(12) NOT NULL COMMENT '国家',
    city char(12) NOT NULL COMMENT '城市',
    telcode char(11) NOT NULL COMMENT '电话'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='位置信息表';

 

2.1、插入数据示例

package main

import (
    "fmt"

    _ "github.com/go-sql-driver/mysql" // 导入mysql驱动(init函数),但是不用这个包,前面用:_
    "github.com/jmoiron/sqlx"          // 操作数据库用sqlx,sqlx在数据库驱动的层面上又做了一些封装
)// 定义Db变量(这是sqlx的一个连接池)
var Db *sqlx.DB 

// 初始化MySQL连接
func init() {
    database, err := sqlx.Open("mysql", "root:$passwd@tcp(127.0.0.1:3306)/go_dev")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }
    Db = database // 将数据库的链接状态赋值给Db
}

func main() {
    // 开启事务
    conn, err := Db.Begin()
    if err != nil {
        return
    }

    // 使用开启事务的链接执行SQL插入语句,values(?, ?, ?)":是占位符
    r, err := conn.Exec("insert into go_dev_person(username, sex, email)values(?, ?, ?)", "stu001", "man", "stu01@qq.com")
    if err != nil {
        fmt.Println("exec failed, ", err)
        // 执行sql语句失败了就回滚
        conn.Rollback()
        return
    }
    id, err := r.LastInsertId() // 通过r.LastInsertId()方法获取刚插入数据的ID值
    if err != nil {
        fmt.Println("exec failed, ", err)
        // 执行sql语句失败了就回滚
        conn.Rollback()
        return
    }

    fmt.Println("insert succ:", id) // 打印刚插入数据的ID
    // 如果上面的插入操作没有失败就将事务提交到数据库里(生效到数据库)
    conn.Commit()
}

 

2.2、查询数据示例

package main

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

type Person struct {
    UserId   int    `db:"user_id"`
    Username string `db:"username"`
    Sex      string `db:"sex"`
    Email    string `db:"email"`
}

type Place struct {
    Country string `db:"country"`
    City    string `db:"city"`
    TelCode int    `db:"telcode"`
}
var Db *sqlx.DB
func init() {

    database, err := sqlx.Open("mysql", "root:1q2w3e$R@tcp(127.0.0.1:3306)/go_dev")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }

    Db = database
}

func main() {
    // 1.定义切片类型的变量Person
    var person []Person
    // 2.将查询结果存储到Person变量里
    err := Db.Select(&person, "select user_id, username, sex, email from go_dev_person where user_id=?", 1)
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }

    fmt.Println("select succ:", person)
}

 

2.3、更改数据示例

package main

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

var Db *sqlx.DB

func init() {

    database, err := sqlx.Open("mysql", "root:1q2w3e$R@tcp(127.0.0.1:3306)/go_dev")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }

    Db = database
}

func main() {
    // 开启事务
    conn, err := Db.Begin()
    if err != nil {
        return
    }

    _, err = conn.Exec("update go_dev_person set username=? where user_id=?", "stu0001", 1)
    if err != nil {
        fmt.Println("exec failed, ", err)
        // 执行sql语句失败了就回滚
        conn.Rollback()
        return
    }
    // 如果上面的插入操作没有失败就将事务提交到数据库里(生效到数据库)
    conn.Commit()

}

 

2.4、删除数据示例

package main

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


var Db *sqlx.DB

func init() {

    database, err := sqlx.Open("mysql", "root:1q2w3e$R@tcp(127.0.0.1:3306)/go_dev")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }

    Db = database
}

func main() {
    // 开启事务
    conn, err := Db.Begin()
    if err != nil {
        return
    }
    _, err = conn.Exec("delete from go_dev_person where user_id=?", 1)
    if err != nil {
        fmt.Println("exec failed, ", err)
        // 执行sql语句失败了就回滚
        conn.Rollback()
        return
    }

    fmt.Println("delete succ")
    conn.Commit()
}

 

posted @ 2020-08-23 14:10  欧-阳  阅读(621)  评论(1)    收藏  举报