zoukankan      html  css  js  c++  java
  • Gorm 学习笔记

    orm 对象关系映射

    o => 结构体 => 模型对应数据库中某张表

    r => mysql

    m => 映射

    结构体对应一张数据表,结构体字段对应数据库字段,结构体实例对应一条数据行记录。

    1.自动迁移功能

    2.表名默认为结构体名称的复数。大驼峰结构会被转化成小写下划线链接。定义结构体过程就是在定义模型

    3.结构体标签,约束建表的约束

    4.加统一数据表前缀

    5.colmun可以设置结构体字段映射到数据表的字段

    6.DB.Debug().Create() => 开启debug 模式可以打印执行的sql语句

    7.所有字段的零值都不会被保存到数据库,但会自动填充预设的默认值。===>

    (1)如果想更新零值,在定义结构体字段时,给指针类型,如

    (2)或者给 sql.NullString 类型

    type UserInfo struct {
         Name  *string  `json:"name"` 
    }

    DB.Create(&UserInfo{ Name: new(string) }) // 这里需要构建一个 new(string) 字符串指针,不然传入类型不匹配。

    type UserInfo struct {
         Name  sql.NullString `json:"name"` 
    }
    
    
    DB.Create(&UserInfo{ Name: sql.NullString{String:"", Vaild:true} }) // 这里需要构建一个 new(string) 字符串指针,不然传入类型不匹配。
     

    (8) 通过结构体查询时,零值也会被忽略,不会通过零值过滤数据  

    (9) Count 必须是链式查询的最后一个操作

    (10)Select 可以指定别名

    (11) Save 方法默认会修改所有字段!!

    (12)Update / Updates 修改指定字段。Updates()方法里传入 map 时,只会更新有变化的字段。传入 struct ,只会更新指定的非0值字段。更新选定的字段Select, Omit。需要更新零值时传入 map

    (13) 查询默认是查不到软删除记录的,如果需要查询,则加 Unscope()

    (1)定义模型

    (2)将模型与数据库对应起来(自动迁移)

    (3)实例化结构体,操作数据库

    var user User // 创建一个类型为 User 结构体的变量 user

    DB.First(&user) // 查询结果给 变量 user 赋值

    First 里传入指针 user := new(User) 时,则可以直接传入 DB.First(user)

    但是gorm.Updates时可要注意了, 如果没有使用db.Model指定model结构体, 就不能更新UpdatedAt.

    所以如果这样:

    db.Table(tableName).Updates(map[string]interface{})
    

    是无法更新更新时间的.

    正确做法是:

    db.Model(&User{}).Updates(map[string]interface{})
  • 相关阅读:
    iOS:分组的表格视图UITableView,可以折叠和展开
    iOS:带主标题、副标题、图像类型的表格视图UITableView
    iOS:多个单元格的删除(方法二):
    iOS:多个单元格的删除(方法一)
    iOS:UITableViewCell自定义单元格
    iOS:删除、插入、移动单元格
    iOS:UITableView表格视图控件
    iOS:UIImageView图像视图控件
    iOS:UIScrollView控件和UIPageControl控件的详解
    淘宝卖家工具推荐
  • 原文地址:https://www.cnblogs.com/winyh/p/14811754.html
Copyright © 2011-2022 走看看