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

来源:互联网 发布:网络数据传输 编辑:程序博客网 时间:2024/04/27 00:50

生命不止,继续 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-winx64datadir=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 -installService successfully installed.

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

初始化
键入命令:

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

启动服务

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

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

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

首先要停止服务:

D:\mysql-5.7.18-winx64\bin>net stop mysqlMySQL 服务正在停止.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 -pEnter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 3Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

键入命令:

mysql> use mysqlDatabase 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 mainimport (    "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

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

这里写图片描述