(摘) GoFrame框架学习 续

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

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

写入保存

  1. Insert 使用INSERT INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,返回失败,否则写入一条新数据;

  2. InsertIgnore 使用INSERT IGNORE INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,忽略错误继续执行写入;

  3. Replace 使用REPLACE INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,会删除原有的记录,必定会写入一条新记录;

  4. Save 使用INSERT INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,更新原有数据,否则写入一条新数据;

使用示例

相关文章