这里以常见的mysql数据库进行说明。
Mysql数据库的驱动:
https://github.com/go-sql-driver/mysql 支持database/sql,全部采用go写。
1 数据库测试表
以用户表为例:
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '系统用户名称',
`user_pwd` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '系统用户密码',
`role_id` int(255) DEFAULT NULL COMMENT '角色',
`user_phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '手机号',
`reg_time` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登记时间',
`user_status` int(1) NOT NULL DEFAULT 0 COMMENT '状态(0:无效;1:有效)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统管理员帐号' ROW_FORMAT = Dynamic;
表中已有的数据:
2 安装mysql驱动
安装mysql驱动
第1种方式:go get下载命令:
go get github.com/go-sql-driver/mysql
第2种方式:配置go.mod文件。
require github.com/go-sql-driver/mysql v1.6.0
通过go module方式下载管理,工程会自动下载所需的包:
3 mysql操作
3.1 打开数据库
打开数据库的函数代码如下:
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/ dbname")
3.2 CRUD操作
执行sql语句两种方式:
第1种: 直接执行sql语句。
//查询多行
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
//查询单行
func (db *DB) QueryRow(query string, args ...interface{}) *Row
//INSERT、DELETE、UPDATE等
func (db *DB) Exec(query string, args ...interface{}) (Result, error)
第2种: 预编译方式
预编译时,不需要设置数据,使用问号占位即可。
func (db *DB) Prepare(query string) (*Stmt, error)
会返回 sql.Stmt 对象,之后的操作:
func (db *DB) Prepare(query string) (*Stmt, error)
会返回 sql.Stmt 对象,之后的操作:
//执行非查询类语句
func (s *Stmt) Exec(args ...interface{}) (Result, error)
//执行查询类语句,返回多行的 Rows 对象
func (s *Stmt) Query(args ...interface{}) (*Rows, error)
//执行查询类语句,返回单行的 Row 对象
func (s *Stmt) QueryRow(args ...interface{}) *Row
我们这里选择第1种方式测试。
3.2.1 测试查询数据
执行查询数据代码如下:
//查询数据
func SelectData(db *sql.DB) {
rows, err := db.Query("select id, user_name, user_pwd, user_phone from t_user")
if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
for rows.Next() {
var id int64
var userName string
var userPwd string
var userPhone string
rows.Scan(&id, &userName, &userPwd, &userPhone)
fmt.Println(id)
fmt.Println(userName)
fmt.Println(userPwd)
fmt.Println(userPhone)
}
}
查询结果如下:
3.2.1 测试修改数据
修改数据,执行代码如下:
//修改数据
func UpdateData(db *sql.DB) (sql.Result, error) {
//修改
results, err:= db.Exec("UPDATE t_user SET user_pwd=? WHERE user_name=?","654321","令狐冲" )
return results,err
}
执行后查询结果如下:
3.3 事务
事务相关的操作:
//开启事务,返回Tx事务对象应用
func (db *DB) Begin() (*Tx, error)
//提交事务
func (tx *Tx) Commit() error
//回滚事务
func (tx *Tx) Rollback() error
//执行非查询类SQL
func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)
//执行查询类SQL,返回多条
func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error)
//执行查询类sQL,返回单条
func (tx *Tx) QueryRow(query string, args ...interface{}) *Row
//预编译
func (tx *Tx) Prepare(query string) (*tmt, error)
//将事务外预编译好的语句对象纳入事务
func (tx *Tx) Stmt(stmt *Stmt) *Stmt
代码详见:
https://gitee.com/linghufeixia/go-simple
chapter5