gorm 初步研究实例

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

内容简介: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 初步研究实例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Trading and Exchanges

Trading and Exchanges

Larry Harris / Oxford University Press, USA / 2002-10-24 / USD 95.00

This book is about trading, the people who trade securities and contracts, the marketplaces where they trade, and the rules that govern it. Readers will learn about investors, brokers, dealers, arbit......一起来看看 《Trading and Exchanges》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

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

在线 XML 格式化压缩工具