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() }

浙公网安备 33010602011771号