GoFrame的文档实在太多,把部份模块的资料单独提出来
GF(Go Frame)是一款模块化、高性能、企业级的Go基础开发框架。完整详实的中文文档,可以减轻学习的压力。
主库:https://github.com/gogf/gf
码云:https://gitee.com/johng/gf
中文文档:https://itician.org/pages/viewpage.action?pageId=1114119
数据库ORM
支持的数据库类型
MySQL
SQLite 需要引入第三方包 _ “github.com/mattn/go-sqlite3”
PostgreSQL 需要引入第三方包 _ “github.com/lib/pq”
SQL Server 需导入第三方包 _ “github.com/denisenkom/go-mssqldb”
Oracle 需导入第三方包 _ “github.com/mattn/go-oci8”
ORM使用配置
完整配置
[database]
[[database.分组名称]]
host = "地址"
port = "端口"
user = "账号"
pass = "密码"
name = "数据库名称"
type = "数据库类型(mysql/pgsql/mssql/sqlite/oracle)"
role = "(可选)数据库主从角色(master/slave),不使用应用层的主从机制请均设置为master"
debug = "(可选)开启调试模式"
prefix = "(可选)表名前缀"
dryRun = "(可选)ORM空跑(只读不写)"
charset = "(可选)数据库编码(如: utf8/gbk/gb2312),一般设置为utf8"
weight = "(可选)负载均衡权重,用于负载均衡控制,不使用应用层的负载均衡机制请置空"
linkinfo = "(可选)自定义数据库链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效,但是type必须有值"
maxIdle = "(可选)连接池最大闲置的连接数"
maxOpen = "(可选)连接池最大打开的连接数"
maxLifetime = "(可选,单位秒)连接对象可重复使用的时间长度"
createdAt = "(可选)自动创建时间字段名称"
updatedAt = "(可选)自动更新时间字段名称"
deletedAt = "(可选)软删除时间字段名称"
timeMaintainDisabled = "(可选)是否完全关闭时间更新特性,true时CreatedAt/UpdatedAt/DeletedAt都将失效"
简化配置(推荐)
[database]
[[database.default]]
type = "mysql"
link = "root:12345678@tcp(127.0.0.1:3306)/test"
[[database.user]]
type = "mysql"
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
不同数据类型对应的link如下:
mysql mysql: 账号:密码@tcp(地址:端口)/数据库名称 mysql
pgsql pgsql: user=账号 password=密码 host=地址 port=端口 dbname=数据库名称 pq
mssql mssql: user id=账号;password=密码;server=地址;port=端口;database=数据库名称;encrypt=disable go-mssqldb
sqlite sqlite: 文件绝对路径 (如: /var/lib/db.sqlite3) go-sqlite3
oracle oracle: 账号/密码@地址:端口/数据库名称 go-oci8
日志输出配置
[database]
[database.logger]
path = "/var/log/gf-app/sql"
level = "all"
stdout = true
[database.primary]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user_center"
debug = true
ORM链式操作
模型创建
m := g.DB().Table("user")
m := g.DB().Model("user")
m := g.DB("user-center").Model("user")
user := g.DB().Model("user")
user.Where("status IN(?)", g.Slice{1,2,3})
if vip {
// 查询条件自动叠加,修改当前模型对象
user.Where("money>=?", 1000000)
} else {
// 查询条件自动叠加,修改当前模型对象
user.Where("money<?", 1000000)
}
// vip: SELECT * FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT * FROM user WHERE status IN(1,2,3) AND money < 1000000
r, err := user.All()
// vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money < 1000000
n, err := user.Count()
Clone方法
// 定义一个用户模型单例
user := g.DB().Model("user")
// 克隆一个新的用户模型
m := user.Clone()
m.Where("status IN(?)", g.Slice{1,2,3})
if vip {
m.And("money>=?", 1000000)
} else {
m.And("money<?", 1000000)
}
// vip: SELECT * FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT * FROM user WHERE status IN(1,2,3) AND money < 1000000
r, err := m.All()
// vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money < 1000000
n, err := m.Count()
Safe方法
// 定义一个用户模型单例
user := g.DB().Model("user").Safe()
m := user.Where("status IN(?)", g.Slice{1,2,3})
if vip {
// 查询条件通过赋值叠加
m = m.And("money>=?", 1000000)
} else {
// 查询条件通过赋值叠加
m = m.And("money<?", 1000000)
}
// vip: SELECT * FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT * FROM user WHERE status IN(1,2,3) AND money < 1000000
r, err := m.All()
// vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money >= 1000000
// !vip: SELECT COUNT(1) FROM user WHERE status IN(1,2,3) AND money < 1000000
n, err := m.Count()
写入保存
-
Insert 使用INSERT INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,返回失败,否则写入一条新数据;
-
InsertIgnore 使用INSERT IGNORE INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,忽略错误继续执行写入;
-
Replace 使用REPLACE INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,会删除原有的记录,必定会写入一条新记录;
-
Save 使用INSERT INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,更新原有数据,否则写入一条新数据;