> 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
}
~~~
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键