gorm 初步研究实例

栏目: 数据库 · 发布时间: 5年前

内容简介:flame/gorm/model/user.goflame/gorm/model/creditCard.goflame/gorm/model/phone.go

表设计

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  `birthday` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '生日',
  `email` varchar(128) NOT NULL DEFAULT '' COMMENT 'email',
  `credit_card_id` int(11) NOT NULL DEFAULT '0' COMMENT '信用卡ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

CREATE TABLE `credit_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `number` varchar(64) NOT NULL DEFAULT '' COMMENT '卡号',
  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='信用卡表';

CREATE TABLE `phone` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `number` varchar(64) NOT NULL DEFAULT '' COMMENT '手机号',
  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='手机号表';

CREATE TABLE `language` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '语言名称',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='语言表';

CREATE TABLE `user_language` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
  `language_id` int(11) NOT NULL DEFAULT '0' COMMENT '语言ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户语言关联表';

模型

flame/gorm/model/user.go

package model

import (
    "github.com/jinzhu/gorm"
    "time"
)

type User struct {
    gorm.Model
    Name string
    Age uint
    Birthday *time.Time //数据库字段值可以为NULL 时得使用指针,否则可以不用指针
    Email string

    CreditCard *CreditCard   //避免循环嵌套,使用指针形式
    //has one 模型
    //不填foreignkey,默认就是【此字段type】【CreditCard】+primarykey【ID】 为【CreditCardID】
    //不填association_foreignkey,默认就是【此字段type】【User】的 primarykey【ID】,
    //即`gorm:"foreignkey:CreditCardID;association_foreignkey:ID"`
    CreditCardID uint
    //为foreignkey,在本struct内 ,指向拥有哪个信用卡
    //foreignkey【CreditCard】.【CreditCardID】———————>association_foreignkey【CreditCard】.【ID】

    Phones []Phone `gorm:"foreignkey:UserID"`
    //has many 模型 必须要配置foreignkey
    //不填association_foreignkey,默认就是【此struct】【User】的 primarykey【ID】,
    //即`gorm:"foreignkey:UserID;association_foreignkey:ID"`
    //association_foreignkey【User】.【ID】———————>foreignkey【Phone】.【UserID】

    Languages []Language `gorm:"many2many:user_language;"`
    //many to many 模型 必须要配置many2many
    //关联表为user_language
    //不填foreignkey,默认就是【此struct】【User】的 primarykey【ID】
    //不填association_foreignkey,默认就是【此字段type】【Language】的 primarykey【ID】
    //不填jointable_foreignkey,默认就是【此struct】【User】+primarykey【ID】 为【UserID】 转换成【user_id】
    //不填association_jointable_foreignkey,默认就是【此字段type】【Language】+primarykey【ID】 为【LanguageID】 转换成【language_id】
    //foreignkey【User】.【ID】———————>jointable_foreignkey【user_language】.【user_id】
    //association_jointable_foreignkey【user_language】.【language_id】———————>不填association_foreignkey【Language】.【I】

    //多对多 存在循环时使用指针,否则可以不用指针,避免循环嵌套
}

flame/gorm/model/creditCard.go

package model

import (
    "github.com/jinzhu/gorm"
)

type CreditCard struct {
    gorm.Model
    Number string

    User *User    //避免循环嵌套,使用指针形式
    //belong to模型
    //不填foreignkey,默认就是【此字段type】【User】+primarykey【ID】 为【UserID】
    //不填association_foreignkey,默认就是此字段type【User】的 primarykey【ID】, 
    //即`gorm:"foreignkey:UserID;association_foreignkey:ID"`
    UserID int
    //为foreignkey, 在本struct内 ,指向归属哪个User
    //foreignkey【CreditCard】.【UserID】———————>association_foreignkey【User】.【ID】

}

flame/gorm/model/phone.go

package model

import (
    "github.com/jinzhu/gorm"
)

type Phone struct {
    gorm.Model
    Number string

    User User
    //belong to模型
    //不填foreignkey,默认就是此字段type【User】+primarykey【ID】 为【UserID】
    //不填association_foreignkey,默认就是此字段type【User】的 primarykey【ID】, 
    //即`gorm:"foreignkey:UserID;association_foreignkey:ID"`
    UserID int
    //为foreignkey, 在本struct内 ,指向归属哪个User
    //foreignkey【CreditCard】.【UserID】———————>association_foreignkey【User】.【ID】

}

flame/gorm/model/language.go

package model

import (
    "github.com/jinzhu/gorm"
)

type Language struct {
    gorm.Model
    Name string
}

repository

flame/gorm/repository/User.go

package repository

import (
    "errors"

    "github.com/jinzhu/gorm"

    "flame/gorm/model"
)

type UserRepository interface {
    GetUserById(id int) (user model.User, err error)
}

func NewUserRepository(db *gorm.DB) UserRepository {
    return &userDBRepository{db: db}
}

type userDBRepository struct {
    db *gorm.DB
}

func(this *userDBRepository) GetUserById(id int)(user model.User, err error){
    err = this.db.Where("id = ?", id).First(&user).Error
    if err != nil {
        return model.User{}, errors.New("查询失败")
    }
    return user, nil
}

dbinstance

flame/gorm/dbinstance/mysql.go

package dbinstance

import (
    "fmt"
    "os"
    "log"
    "sync"
    
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

var mysqlManager *MysqlManager
var mysqlOnce sync.Once
func GetMysqlInstance() *MysqlManager{
    mysqlOnce.Do(func(){
        mysqlManager=new(MysqlManager)
        mysqlManager.init()
    })

    return mysqlManager
}



type MysqlManager struct {
    DB *gorm.DB
    ErrorMsg error
}


func (this *MysqlManager) init() (*gorm.DB,error) {
    this.DB, this.ErrorMsg = gorm.Open("mysql", "<user>:<password>@tcp(<host>:<port>)/<db>?charset=utf8mb4&parseTime=True&loc=Local")
    fmt.Println(this.ErrorMsg)
    if this.ErrorMsg != nil {
        log.Fatal(this.ErrorMsg)
    } else {
        this.DB.SingularTable(true)//表名为单数版
        this.DB.LogMode(true)  //输出日志
        this.DB.SetLogger(log.New(os.Stdout, "\r\n", 0))//输出到控制台

    }

    return this.DB,this.ErrorMsg
}

func (this *MysqlManager) Destroy(){
    this.DB.Close()
}

main 测试

flame/gorm/main.go

package main

import (
    "fmt"

    "flame/gorm/dbinstance"
    "flame/gorm/repository"
)


func main(){

    mysqlManager:=dbinstance.GetMysqlInstance()
    defer mysqlManager.Destroy()


    db:=mysqlManager.DB
    

    userDBRepository:=repository.NewUserRepository(db)
    user,err:=userDBRepository.GetUserById(1)
    fmt.Println(user)
    fmt.Println(err)

}

运行得到输出

<nil>

sql/home/flame/go/src/flame/gorm/repository/User.go:243.526054msSELECT * FROM `user`  WHERE `user`.`deleted_at` IS NULL AND ((id = ?)) 
ORDER BY `user`.`id` ASC LIMIT 1[1] 0
{{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>}  0 <nil>  <nil> 0 [] []}
查询失败

由于gorm 判断带有deleted_at 字段就会根据这个值是否NULL来判断是否删除,

而我数据库字段设计是

deleted_at` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '删除时间',

有默认值,所以获取不到结果


以上所述就是小编给大家介绍的《gorm 初步研究实例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SQL基础教程

SQL基础教程

MICK / 孙淼、罗勇 / 人民邮电出版社 / 2017-6-1 / CNY 79.00

本书是畅销书《SQL基础教程》第2版,介绍了关系数据库以及用来操作关系数据库的SQL语言的使用方法。书中通过丰富的图示、大量示例程序和详实的操作步骤说明,让读者循序渐进地掌握SQL的基础知识和使用技巧,切实提高编程能力。每章结尾设置有练习题,帮助读者检验对各章内容的理解程度。另外,本书还将重要知识点总结为“法则”,方便读者随时查阅。第2版除了将示例程序更新为对应新版本的DB的SQL之外,还新增了一......一起来看看 《SQL基础教程》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器