多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> GORM是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单 [TOC] ## 安装依赖包 ~~~ //安装MySQL驱动 go get github.com/go-sql-driver/mysql //安装gorm包 go get github.com/jinzhu/gorm ~~~ ## 导入依赖包 ~~~ import ( //导入MYSQL数据库驱动,这里使用的是GORM库封装的MYSQL驱动导入包,实际上大家看源码就知道,这里等价于导入github.com/go-sql-driver/mysql //这里导入包使用了 _ 前缀代表仅仅是导入这个包,但是我们在代码里面不会直接使用。 _ "github.com/jinzhu/gorm/dialects/mysql" //导入gorm "github.com/jinzhu/gorm" ) ~~~ ## 创建User表 ~~~ CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `username` varchar(30) NOT NULL COMMENT '账号', `password` varchar(100) NOT NULL COMMENT '密码', `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ~~~ ## 简单例子 ~~~ package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "time" ) //定义User模型,绑定user表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应 //在这里User类型可以代表mysql user表 type User struct { //通过在字段后面的标签说明,定义golang字段和表字段的关系 //例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username //这里golang定义的Username变量和MYSQL表字段username一样,他们的名字可以不一样。 Username string `gorm:"column:username"` Password string `gorm:"column:password"` //创建时间,时间戳 CreateTime int64 `gorm:"column:createtime"` } //设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么 func (u User) TableName() string { //绑定MYSQL表名为user return "user" } func main() { //配置MySQL连接参数 username := "gintest" //账号 password := "gin123456" //密码 host := "127.0.0.1" //数据库地址,可以是Ip或者域名 port := 3306 //数据库端口 Dbname := "gintest" //数据库名 //通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称) //MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local //类似{username}使用花括号包着的名字都是需要替换的参数 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname) //连接MYSQL db, err := gorm.Open("mysql", dsn) if err != nil { panic("连接数据库失败, error=" + err.Error()) } //定义一个用户,并初始化数据 u := User{ Username:"tizi365", Password:"123456", CreateTime:time.Now().Unix(), } //插入一条用户数据 //下面代码会自动生成SQL语句:INSERT INTO `user` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823') if err := db.Create(u).Error; err != nil { fmt.Println("插入失败", err) return } //查询并返回第一条数据 //定义需要保存数据的struct变量 u = User{} //自动生成sql: SELECT * FROM `user` WHERE (username = 'tizi365') LIMIT 1 isNotFound := db.Where("username = ?", "tizi365").Take(&u).RecordNotFound() if isNotFound { fmt.Println("找不到记录") return } //打印查询到的数据 fmt.Println(u.Username,u.Password) //更新 //自动生成Sql: UPDATE `user` SET `password` = '654321' WHERE (username = 'tizi365') db.Model(User{}).Where("username = ?", "tizi365").Update("password", "654321") //删除 //自动生成Sql: DELETE FROM `user` WHERE (username = 'tizi365') db.Where("username = ?", "tizi365").Delete(User{}) } ~~~ ## gorm错误处理 > gorm库在执行数据库操作的时候,如果出现错误,则会更新gorm.DB的Error属性,Error属性默认为nil,因此在执行数据库操作后检测下Error属性是否为nil即可知道有没有错误发生 ~~~ //插入记录后,检测Error是否为nil if err := db.Create(u).Error; err != nil { fmt.Println("插入失败", err) return } ~~~