go语言好用的orm库 go语言gui库

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语言的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 {
【go语言好用的orm库 go语言gui库】Idint
Ageint16
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 改成falsego语言好用的orm库,如果表存在则会给出提示go语言好用的orm库,如果改成false则不会提示,这句话没有会报主键不存在的错误
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,go语言好用的orm库你可以指定为其go语言好用的orm库他数据库
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;

推荐阅读