gorm

gorm系列-model

孤街醉人 提交于 2020-04-28 17:01:44
目录 Gorm Model 模型定义示例 结构体标记(tags) 支持的结构体标记(Struct tags) 关联相关标记(tags) 例子 主键、表名、列名的约定 主键(Primary Key) 表名(Table name) 列名 时间戳跟踪 Gorm Model 在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。同时也支持sql.Scanner(扫描)及driver.Valuer(驱动)接口(interfaces) 为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。 // gorm.Model 定义 type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time } 可以将它嵌入到自己的模型中: // 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中 type User struct {

gorm系列-更新

二次信任 提交于 2020-04-28 17:00:29
目录 Gorm更新操作 更新所有字段 更新修改字段 更新选定字段 无Hooks更新 批量更新 使用SQL表达式更新 修改Hooks中的值 其它更新选项 Gorm更新操作 更新所有字段 Save()默认会更新该对象的所有字段,即使你没有赋值。 package main import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模型 type User struct { gorm.Model Name string Age byte Active bool } func main() { //2. 连接Mysql数据库 db, err := gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local") if err != nil { panic(err) } defer db.Close() //3. 把模型与数据库中的表对应起来 db.AutoMigrate(&User{}) //4. 创建 //u1 := User{Name:"zisefeizhu", Age: 22, Active: true} //db.Create(&u1) //u2

gorm系列-创建记录及字段默认值

微笑、不失礼 提交于 2020-04-28 16:18:25
目录 Gorm创建记录及字段默认值 创建 默认值 使用指针方式实现零值存入数据库 使用Scanner/Valuer接口方式实现零值存入数据库 Gorm创建记录及字段默认值 CRUD通常指数据库的增删改查操作 创建 package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //1. 定义模型 type User struct { ID int64 Name string Age byte } func main() { //2. 连接Mysql数据库 db, err := gorm.Open("mysql","root:123456@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local") if err != nil { panic(err) } defer db.Close() //3. 把模型与数据库中的表对应起来 db.AutoMigrate(&User{}) //4. 创建结构体实例 u := User{Name:"zisefeizhu", Age:22} //在代码层面创建一个User对象 fmt.Println(db.NewRecord(&u)) // 主键为空返回

GORM---关联外键查询

前提是你 提交于 2020-04-20 12:25:02
前几天的方案,是可以查询一个应用关联的用户及所属项目。 但有个问题, 那个外键里,会包含所有的外键关键信息,包括用户密码这些····· 所以,要用preload的闭包来作过滤。 这样看来起,是安全了不少。 但有个小尾巴没有解决: 就是用户密码那里是为空,如何能完全不包含呢???????? 存疑,再解决。 //GetApplications 获取Applications func (a *ApplicationRepository) GetApplications(PageNum uint, PageSize uint, total *uint64, where interface{}) *[]models.Application { var applications []models.Application db := a.Source.DB().Model(&applications).Where(&applications) db = db.Preload("User", func(db *gorm.DB) *gorm.DB { return db.Select("id,username") }).Preload("Project", func(db *gorm.DB) *gorm.DB { return db.Select("id,name,cn_name,

[Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)

寵の児 提交于 2020-04-18 13:10:23
在 golang 某些 orm 中,你经常会看到这种用法: func main() { db, err : = gorm.Open( " sqlite3 " , " test.db " ) if err != nil { panic( " failed to connect database " ) } defer db.Close() // db 操作 } 在主逻辑中使用 defer 最后关闭连接是没有问题的。 如果是在模块化开发,我们把一些数据库连接的操作封装到函数中,就不能带有 defer,比如: func Connect() * gorm.DB { db, err : = gorm.Open( " mysql " , " root:123456@(xx.xx.xx.xx:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local " ) if err != nil { panic( " MySql Connect error " ) } defer db.Close() return db } 由于 defer 是在逻辑的最后执行的,实际上到 return 的时候,返回的已经是 null。 继续操作会提示:sql: database is closed 合理使用 defer 释放资源,可以有效减少资源句柄的占用。 Link:

gorm 关系 Many to Many 多对多

冷暖自知 提交于 2020-04-15 10:05:17
【推荐阅读】微服务还能火多久?>>> 多对多(Many to Many)在两个模型之间增加一个 join 表(中间表)。 例如,如果您的应用程序包含用户和语言,并且用户可以说多种语言,并且许多用户可以说出某种语言,用户和语言就有多对多的关系。 定义模型: // User has and belongs to many languages, use `user_languages` as join table type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string } 用 AutoMigrate 方法 User 表,会自动创建 user_languages 表,模式为: CREATE TABLE "user_languages" ( "user_id" integer, "language_id" integer, PRIMARY KEY ("user_id","language_id") ); 创建记录 langEN := Language{Name: "EN"} db.Create(&langEN) langCN := Language{Name: "CN"} db

gorm 关系 has one 有一个

﹥>﹥吖頭↗ 提交于 2020-04-15 10:05:02
【推荐阅读】微服务还能火多久?>>> 有一个(has one)关联也建立了与另一个模型的一对一连接,但有一些不同的语义(和后果)。此关联表示模型的每个实例包含或拥有另一个模型的一个实例。 例如,如果您的应用程序包括用户和信用卡以及每个用户 只能有一张信用卡。 定义模型: // User has one CreditCard, UserID is the foreign key // User 有一个 CreditCard,UserId 是外键 type CreditCard struct { gorm.Model Number string UserID uint } type User struct { gorm.Model CreditCard CreditCard } credit_cards 表的 user_id 列是外键,它引用 users 表的 id 列。 has one 关系和 belongs to 关系其实是一会事,所有者有一个附属者,附属者属于一个所有者,User 有一个 CreditCard,CreditCard 属于一个 User。 区别在于定义模型时,has one 关系,把附属者 CreditCard 作为所有者 User 的一个字段,更自然;而 belongs to 关系,把所有者 User 作为附属者 CreditCard 的一个字段。 外键 对于

gorm 关系 belongs to 属于

雨燕双飞 提交于 2020-04-15 09:55:55
【推荐阅读】微服务还能火多久?>>> 属于(belongs to)关联建立与另一模型的一对一连接,使得声明模型的每个实例“属于”另一模型的一个实例。 例如,如果您的应用程序包含用户和配置文件,则每个配置文件只能分配给一个用户。 Profile 属于 User, User 是 Profile 的所有者。 定义模型: type User struct { gorm.Model Name string } // Profile belongs to User, UserID is foreign key // Profile 属于 User,UserID 是外键 type Profile struct { gorm.Model Name string User User UserID uint } profiles 表的 user_id 列是外键,它引用 users 表的 id 列。 外键 要定义属于关系,外键必须存在,默认外键 = 所有者(此处为 User)的类型 + 其主键。 对于上面的示例,要定义属于 User 的模型,外键应为 User + ID = UserID。 外键字段类型最好与它引用的字段类型一致,这里 Profile.UserID 的类型与 User.ID 的类型都为 uint。 GORM提供了一种自定义外键名的方法,例如: type User struct {

beego 中使用关联查询( join 查询)

百般思念 提交于 2020-04-15 09:55:26
【推荐阅读】微服务还能火多久?>>> beego 中使用关联查询( join 查询) 文档所在网址: 这里 //使用实例: article:=new(Article) num,err:= o.QueryTable("go_article").RelatedSel().All(&article) 但直接使用 RelatedSel() 是不行,还必须先在 model中定义: type User struct { Id int Name string Age int } type Article stuct { Id int Title string Content string User *User `orm:"rel(fk)"` //这样写,默认在Article中应该有一个user_id的字段,如果没有,通过beego自动建表的话,它会生成;如果是手动建表,记得把user_id 这个字段加上去 } 定义表字段为"rel(fk)",即外键,要定义其它类型的,请看文档。 命令行自动建表: orm.RunCommand() //main函数或init函数中需要加这行代码,否则不能自动建表 go build main.go #先在命令行中执行这句,会生成main.exe文件 ./main orm syncdb -h #-h会提示可用的参数 ./main orm syncdb -v

Changing GORM table name

人走茶凉 提交于 2020-02-27 23:06:49
问题 I'm fighting to get the following mapping working in Grails 1.3.1 and MySQL: class Login { int id String email static mappings = { table 'my_table' id column: "Mgr_id" version false } } No matter what I do the queries that are being issued refer to "schema.login" table instead of "schema.my_table". This is very frustrating... Can anyone answer why this might not be working? 回答1: Please forgive my blindness... The static is called mapping not mappings ... eh. Shame on me... Block should be