Golang 项目中 ORM 选择 , gorm xorm 对比之前用 beego 中自带的 ormormgo语言 , 感觉有一些不是很满足需求的地方ormgo语言,而且想要尝试一些新的 orm,写一篇记录一下 。
在xorm和gorm之间对比ormgo语言了一下ormgo语言:
p.s. 需要说明的是,对比非常初级,而且项目处于很早期,也抱着尝试一下不行再改的心理,并没有想要得到一个孰优孰劣的结论 。
想来想去,对于一个成熟的项目可能 gorm 更适合,但是 xorm 好像近期在频繁 commit,有一种想要追赶的意思 。
那ormgo语言我先试试 xorm,不知道为什么选的这个,可能是想试试看新款吧 。(大雾
2017/07/04
可怕,xorm 不支持外键关系 。一对一啥的 。
如何使用go语言的beego框架的ormmodels.go
============================
package main
import (
"github.com/astaxie/beego/orm"
)
type User struct {
Idint
Namestring
Profile *Profile `orm:"rel(one)"` // OneToOne relation
}
type Profile struct {
Idint
Ageint16
User *User `orm:"reverse(one)"` // 设置反向关系(可选)
}
func init() {
// 需要在init中注册定义的model
【ormgo语言 origin的语言】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)
则执行结果不会提示 。
Golang database/sql源码分析Gorm是Go语言开发用的比较多的一个ORM 。它的功能比较全:
但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析 。原因是Gorm也是基于这个包来封装的一些功能 。所以只有先了解了database/sql包才能更加好的理解Gorm源码 。
database/sql 其实也是一个对于mysql驱动的上层封装 。”github.com/go-sql-driver/mysql”就是一个对于mysql的驱动 , database/sql 就是在这个基础上做的基本封装包含连接池的使用
下面这个是最基本的增删改查操作
操作分下面几个步骤:
因为Gorm的连接池就是使用database/sql包中的连接池,所以这里我们需要学习一下包里的连接池的源码实现 。其实所有连接池最重要的就是连接池对象、获取函数、释放函数下面来看一下database/sql中的连接池 。
DB对象
获取方法
释放连接方法
连接池的实现有很多方法,在database/sql包中使用的是chan阻塞 使用map记录等待列表,等到有连接释放的时候再把连接传入等待列表中的chan 不在阻塞返回连接 。
之前我们看到的Redigo是使用一个chan 来阻塞 , 然后释放的时候放入空闲列表,在往这一个chan中传入struct{}{} , 让程序继续 获取的时候再从空闲列表中获取 。并且使用的是链表的结构来存储空闲列表 。
database/sql 是对于mysql驱动的封装,然而Gorm则是对于database/sql的再次封装 。让我们可以更加简单的实现对于mysql数据库的操作 。
go语言要求linux精通哪些东西Go 生态系统
学习基本上相当直接的 。我们之前在 C/C/Java/Objective-C/PHP 的经验让我们学习 Go 相当快ormgo语言,并且在几天内就开始开发了 。当然会有一些新的和不常见的东西需要学习,包括 GOPATH 还有如何处理包,但这在我们的预期之内 。
几天之内,我们意识到即使是一个以简化为设计目的的语言,Go 也是非常强大的 。它能够做任何现代编程语言应该能做的事:能够处理 JSON、服务器之间通讯甚至访问数据库也没问题(并且只需要几行代码) 。
在构建一个服务器时 , ormgo语言你应该首先决定是否使用任何第三方库或者框架 。对于 Bugfender,我们决定使用:
Martini
Martini 是一个强大的 Go 的 web 框架 。我们开始这个实验时,它是一个很棒的解决方案,至今也是 , 我们还没遇到任何问题 。然而如果我们今天再次开始这个实验的话,我们会选择一个不同的框架,因为 Martini 不在维护了 。
Gorm
有些人喜欢 ORM , 而有些人则不喜欢 。我们决定使用 ORM,更确切地说是 GORM 。我们的实现只针对 web 前端,对于日志提取 API 仍然继续使用手工优化的 SQL 。在一开始 , 我们确实很喜欢它,但是随着时间的推移,我们开始发现问题,并且我们很快将它从代码中完全移除,并且使用 sqlx 这个标准 SQL 库 。
GORM 的一个主要问题是 Go 的生态系统 。作为一个新语言,自我们开始开发产品以来 Go 已经有很多新版本 。在这些新版本中的一些改变并不向后兼容,因此要使用最新的库版本,我们要经常重写已有代码并检查我们为解决版本问题所做的 hack 。
关于ormgo语言和origin的语言的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 淮安企业erp系统哪家好,淮安软件公司有哪些
- 竖版赛车竞速游戏推荐,横版赛车
- 包含Python是非线性函数的词条
- sqlserver什么是视图,sql中什么是视图
- iphone如何禁止ios更新软件,苹果手机怎么禁止更新app
- 怎么在u盘上传东西,u盘怎样上传电脑
- 函数c语言怎么讲 c语言函数视频讲解
- 核桃编程python入门课程,核桃编程算法进阶
- redismodule加载,redis加载数据