gomysqlcount,Goframe数据库操作
Goframe数据库操作
⼀、基本介绍
gf框架的ORM功能由gdb模块实现,⽤于常⽤关系型数据库的ORM操作。其最⼤的特⾊在于同时⽀持map和struct两种⽅式操作数据库。gdb默认情况下使⽤的是map数据类型作为基础的数据表记录载体,开发者⽆需预先定义数据表记录struct便可直接对数据表记录执⾏各种操作。这样的设计赋予了开发者更⾼的灵活度和简便性。
mysql下载app⽀持的数据库类型:Mysql,SQLite,PostgreSQL,SQLServer,Oracle
⼆、配置⽂件
推荐使⽤配置⽂件及单例对象来管理和使⽤数据库操作。
如果我们使⽤g对象管理模块中的g.DB("数据库分组名称")⽅法获取数据库操作对象,数据库对象将会⾃动读取l配置⽂件中的相应配置项(通过配置管理模块),并⾃动初始化该数据库操作的单例对象。
[database]
[[database.default]]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
[[database.user]]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
注意每⼀项分组配置均可以是多个节点,⽀持负载均衡权重策略。如果不使⽤多节点负载均衡特性,仅使⽤配置分组特性,也可以简化为如下格式:
[database]
[database.default]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
[database.user]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/user"
如果仅仅是单数据库节点,不使⽤配置分组特性,那么也可以简化为如下格式:
[database]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
不同数据类型对应的linkinfo如下:
数据库类型
Linkinfo配置
更多参数
mysql
mysql: 账号:密码@tcp(地址:端⼝)/数据库名称
pgsql
pgsql: user=账号 password=密码 host=地址 port=端⼝ dbname=数据库名称
mssql
mssql: user id=账号;password=密码;server=地址;port=端⼝;database=数据库名称;encrypt=disable
sqlite
sqlite: ⽂件绝对路径 (如: /var/lib/db.sqlite3)
oracle
oracle: 账号/密码@地址:端⼝/数据库名称
三、⽇志输出配置
gdb⽀持⽇志输出,内部使⽤的是glog.Logger对象实现⽇志管理,并且可以通过配置⽂件对⽇志对象进⾏配置。默认情况下gdb关闭了DEBUG⽇志输出,如果需要打开DEBUG信息需要将数据库的debug参数设置为true。以下是为⼀个配置⽂件⽰例:
[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
其中database.logger即为gdb的⽇志配置,当该配置不存在时,将会使⽤⽇志组件的默认配置
四、数据结构
为便于数据表记录的操作,ORM定义了5种基本的数据类型:
type Map map[string]interface{} // 数据记录
type List []Map // 数据记录列表
type Value *gvar.Var // 返回数据表记录值
type Record map[string]Value // 返回数据表记录键值对
type Result []Record // 返回数据表记录列表
Map与List⽤于ORM操作过程中的输⼊参数类型(与全局类型g.Map和g.List⼀致,在项⽬开发中常⽤g.Map和g.List替换);
Value/Record/Result⽤于ORM操作的结果数据类型;
五、数据库操作
Insert/Replace/Save
这三个链式操作⽅法⽤于数据的写⼊,并且⽀持⾃动的单条或者批量的数据写⼊,三者区别如下:
Insert
使⽤INSERT INTO语句进⾏数据库写⼊,如果写⼊的数据中存在主键或者唯⼀索引时,返回失败,否则写⼊⼀条新数据;
Replace
使⽤REPLACE INTO语句进⾏数据库写⼊,如果写⼊的数据中存在主键或者唯⼀索引时,会删除原有的记录,必定会写⼊⼀条新记录;
Save
使⽤INSERT INTO语句进⾏数据库写⼊,如果写⼊的数据中存在主键或者唯⼀索引时,更新原有数据,否则写⼊⼀条新数据;
在部分数据库类型中,并不⽀持Replace/Save⽅法
Update更新⽅法
Update⽤于数据的更新,往往需要结合Data及Where⽅法共同使⽤。Data⽅法⽤于指定需要更新的数据,Where⽅法⽤于指定更新的条件范围。同时,Update⽅法也⽀持直接给定数据和条件参数。
Delete删除⽅法
Delete⽅法⽤于数据的删除。
Where/And/Or查询条件
这三个⽅法⽤于传递查询条件参数,⽀持的参数为任意的string/map/slice/struct/*struct类型。
Where条件参数推荐使⽤字符串的参数传递⽅式(并使⽤?占位符预处理),因为map/struct类型作为查询参数⽆法保证顺序性,且在部分情况下(数据库有时会帮助你⾃动进⾏查询索引优化),数据库的索引和你传递的查询条件顺序有⼀定关系。
当使⽤多个Where⽅法连接查询条件时,作⽤同And。 此外,当存在多个查询条件时,gdb会默认将多个条件分别使⽤()符号进⾏包含,这种设计可以⾮常友好地⽀持查询条件分组。
All/One/Value/Count数据查询
这四个⽅法是数据查询⽐较常⽤的⽅法:
All ⽤于查询并返回多条记录的列表/数组。
One ⽤于查询并返回单条记录。
Value ⽤于查询并返回⼀个字段值,往往需要结合Fields⽅法使⽤。
Count ⽤于查询并返回记录数。
此外,也可以看得到这四个⽅法定义中也⽀持条件参数的直接输⼊,参数类型与Where⽅法⼀致。但需要注意,其中Value⽅法的参数中⾄少应该输⼊字段参数。
数据库表
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`site` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10000 ;
⽰例
package test
import (
"fmt"
"github/gogf/gf/frame/g"
"testing"
)
// Insert
func TestInsert(t *testing.T) {
// INSERT INTO `user`(`name`) VALUES('john')
_, err := g.DB().Model("user").Data(g.Map{"uid": 10000, "name": "john"}).Insert() if err != nil {
panic(err)
}
}
// Update
func TestUpdate(t *testing.T) {
// UPDATE `user` SET `name`='john guo' WHERE name='john'
_, err := g.DB().Model("user").Data("name", "john guo").
Where("name", "john").Update()
if err != nil {
panic(err)
}
}
// Delete
func TestDelete(t *testing.T) {
// DELETE FROM `user` WHERE uid=10
_, err := g.DB().Model("user").Where("uid", 10000).Delete()
if err != nil {
panic(err)
}
}
// Select Where
func TestWhere(t *testing.T) {
// INSERT INTO `user`(`name`) VALUES('john')
g.DB().Model("user").Data(g.Map{"uid": 10001, "name": "john"}).Insert()
g.DB().Model("user").Data(g.Map{"uid": 10002, "name": "john2"}).Insert()
// 数量
count, err := g.DB().Model("user").Where("uid", 10001).Count()
if err != nil {
panic(err)
}
fmt.Println("count:", count)
// 获取单个值
v, err := g.DB().Model("user").Where("uid", 10001).Fields("name").Value() if err != nil {
panic(err)
}
fmt.Println("name:", v.String())
// 查询对象
r, err := g.DB().Model("user").Where("uid", 10002).One()
if err != nil {
panic(err)
}
fmt.Println("name:", r.Map()["name"])
// 查询对象
//l, err := g.DB().Table("user").As("t").Where("t.uid > ?", 10000).All()
// 也可以简写为 select * from user as t where t.uid > 10000
l, err := g.DB().Model("user").As("t").All("t.uid > ?", 10000)
if err != nil {
panic(err)
}
for index, value := range l {
fmt.Println(index, value["uid"], value["name"])
}
g.DB().Model("user").Where("uid", 10001).Delete()
g.DB().Model("user").Where("uid", 10002).Delete()
}
代码地址
项⽬视频
搜索:GoWeb学习之路

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。