============================
package main
import (
"github.com/astaxie/beego/orm"
)
type User struct {
Id int
Namestring
Profile *Profile `orm:"rel(one)"` // OneToOne relation
}
type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // 设置反向关系(可选)
}
func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(User), new(Profile))
}
main.go
==============
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
//orm.RegisterModel(new(User))
orm.RegisterDataBase("default", "mysql", "ta3:ta3@/ta3?charset=utf8")
orm.RunSyncdb("default", false, true) // true 改成false,如果表存在则会给出提示,如果改成false则不会提示 , 这句话没有会报主键不存在的错误
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,你可以指定为其他数据库
user := User{Id: 1}
err := o.Read(&user)
if err == orm.ErrNoRows {
fmt.Println("查询不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主键")
} else {
fmt.Println(user.Id, user.Name)
}
}
执行结果:
create table `user`
-- --------------------------------------------------
-- Table Structure for `main.User`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(255) NOT NULL,
`profile_id` integer NOT NULL UNIQUE
) ENGINE=InnoDB
create table `profile`
-- --------------------------------------------------
-- Table Structure for `main.Profile`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `profile` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`age` smallint NOT NULL
) ENGINE=InnoDB
查询不到
第二次再执行:
table `user` already exists, skip
table `profile` already exists, skip
查询不到
如果 orm.RunSyncdb("default", false, true)改成 orm.RunSyncdb("default", false, false)
则执行结果不会提示。
之前用 beego 中自带的 orm,感觉有一些不是很满足需求的地方,而且想要尝试一些新的 orm,写一篇记录一下。在 xorm 和 gorm 之间对比了一下:
p.s. 需要说明的是,对比非常初级,而且项目处于很早期,也抱着尝试一下不行再改的心理,并没有想要得到一个孰优孰劣的结论。
想来想去,对于一个成熟的项目可能 gorm 更适合,但是 xorm 好像近期在频繁 commit,有一种想要追赶的意思。
那我先试试 xorm ,不知道为什么选的这个,可能是想试试看新款吧。(大雾
2017/07/04
可怕,xorm 不支持外键关系。一对一啥的。
ORM-Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了
GORM就是go语言实现的一个ORM库
特点:
增加(Create)
检索(Retrieve)
更新(Update)
删除(Delete)
如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间。
具体的使用可查看gorm 官方文档
在项目中我们定义一个全局的GVA_DB,方便使用时调用
后续我们在需要查询数据库时便可直接通过global.GVA_DB使用
比如创建商品信息:
我们先通过查询分类是否存在,然后再创建商品
通过gorm的链式操作可以很方便的进行crud操作
分页查询是项目中经常使用到的功能,当指定条件查询的数据量过大时,如果我们将数据一次性返回,会对数据库造成较大的负荷,同时降低接口的性能,通常我们会使用分页查询的方式让数据进行分段展示,从而保障接口的性能。在gorm中我们实用Offset,和Count来实现分页
我们通过前端的传递过来的分页数据进行查询
该商城作为gin的学习项目,没有很复杂的逻辑,所有业务逻辑均通过Mysql实现。包括后面将要介绍的登录态,也是如此。
所有代码已上传github,有兴趣的可以访问https://github.com/newbee-ltd/newbee-mall-api-go/,如果有更好的建议也欢迎提交issure,pr