Go实战--go语言操作MySQL数据库(go-sql-driver/mysql)

标签: 数据库mysqlgolang
4126人阅读 评论(0) 收藏 举报
分类:

生命不止,继续 go go go !!!

之前关于golang操作数据库的博客:
Go实战–go语言操作sqlite数据库(The way to go)

Go实战–golang中使用MongoDB(mgo)

Go实战–golang中使用redis(redigo和go-redis/redis)

今天继续,跟大家介绍golang中如何使用MySQL数据库。

何为MySQL

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

From Wiki:
MySQL(官方发音为/maɪ ˌɛskjuːˈɛl/“My S-Q-L”,但也经常读作/maɪ ˈsiːkwəl/“My Sequel”)原本是一个开放源代码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。
MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google和Facebook等网站。非常流行的开源软件组合LAMP中的“M”指的就是MySQL。
但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社区们对于Oracle是否还会持续支持MySQL社区版(MySQL之中唯一的免费版本)有所隐忧,MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB。而原先一些使用MySQL的开源软件逐渐转向MariaDB或其它的数据库。例如维基百科已于2013年正式宣布将从MySQL迁移到MariaDB数据库。

Windows下安装MySQL

我们当然下载免费的社区版喽,有两种格式,一种是msi,一种是zip。这里介绍的是zip格式的MySQL安装配置。

下载
https://dev.mysql.com/downloads/mysql/

解压
例如解压到D:\mysql-5.7.18-winx64

新建配置文件
在D:\mysql-5.7.18-winx64下新建my.ini文件,my.ini文件键入:

[mysqld]
basedir=D:\mysql-5.7.18-winx64
datadir=D:\mysql-5.7.18-winx64\data

这里切记,千万不要自己手动新建data文件夹

添加环境变量
把D:\mysql-5.7.18-winx64\bin路径添加到环境变量中

启动cmd
这里要注意的是,右键以管理员身份启动cmd.exe,cmd.exe的位置在 C:\Windows\System32

安装MySQL
以管理员身份打开cmd后,进入MySQL所在的文件夹:D:\mysql-5.7.18-winx64\bin,键入命令:

D:\mysql-5.7.18-winx64\bin>mysqld -install
Service successfully installed.

在任务管理器的服务中即可看到:
这里写图片描述

初始化
键入命令:

D:\mysql-5.7.18-winx64\bin>mysqld --initialize

启动服务

D:\mysql-5.7.18-winx64\bin>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

停止服务
至此,你以为大功告成了吗?键入:

D:\mysql-5.7.18-winx64\bin>mysql
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)

首先要停止服务:

D:\mysql-5.7.18-winx64\bin>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。

重置密码
键入命令

D:\mysql-5.7.18-winx64\bin>mysqld --skip-grant-tables

打开另一个cmd,键入:mysql -u root -p,并在输入密码的时候按下回车

D:\mysql-5.7.18-winx64\bin>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

键入命令:

mysql> use mysql
Database changed

键入命令:

mysql> update user set authentication_string=password("wangshubo") where user="root";
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

新建数据库

mysql> create database test;
Query OK, 1 row affected (0.06 sec)

新建表

mysql> create table user_info(
    -> id int(4) not null primary key auto_increment,
    -> name char(20) not null);
Query OK, 0 rows affected (0.29 sec)

go-sql-driver/mysql开源库

github地址
https://github.com/go-sql-driver/mysql

安装

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

导入包

import (
    "database/sql"
    "fmt"

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

连接数据库

    db, err := sql.Open("mysql", "root:wangshubo@/test?charset=utf8")
    checkErr(err)

插入数据

    stmt, err := db.Prepare("INSERT user_info SET id=?,name=?")
    checkErr(err)

    res, err := stmt.Exec(1, "wangshubo")
    checkErr(err)

更新数据

    stmt, err = db.Prepare("update user_info set name=? where id=?")
    checkErr(err)

    res, err = stmt.Exec("astaxieupdate", id)
    checkErr(err)

查询

    rows, err := db.Query("SELECT * FROM user_info")
    checkErr(err)

删除

stmt, err = db.Prepare("delete from user_info where id=?")
checkErr(err)

res, err = stmt.Exec(id)
checkErr(err)

完整代码

package main

import (
    "database/sql"
    "fmt"

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

func main() {
    db, err := sql.Open("mysql", "root:wangshubo@/test?charset=utf8")
    checkErr(err)

    // insert
    stmt, err := db.Prepare("INSERT user_info SET id=?,name=?")
    checkErr(err)

    res, err := stmt.Exec(1, "wangshubo")
    checkErr(err)

    // update
    stmt, err = db.Prepare("update user_info set name=? where id=?")
    checkErr(err)

    res, err = stmt.Exec("wangshubo_update", 1)
    checkErr(err)

    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    // query
    rows, err := db.Query("SELECT * FROM user_info")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string

        err = rows.Scan(&uid, &username)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
    }

    // delete
    stmt, err = db.Prepare("delete from user_info where id=?")
    checkErr(err)

    res, err = stmt.Exec(1)
    checkErr(err)

    // query
    rows, err = db.Query("SELECT * FROM user_info")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string

        err = rows.Scan(&uid, &username)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
    }

    db.Close()

}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

输出:
1
1
wangshubo_update
2
wangshubo
2
wangshubo

通过命令行查看表
这里写图片描述

这里写图片描述

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4160387次
    • 积分:38314
    • 等级:
    • 排名:第116名
    • 原创:550篇
    • 转载:28篇
    • 译文:13篇
    • 评论:739条
    微信公众号
      我的微信公众号
      为你推荐最新的博文~更有惊喜等着你
    时光荏苒
      白驹过隙
    博客专栏
    文章分类
    百度统计
    Google Analytics