zoukankan      html  css  js  c++  java
  • 业精于勤荒于嬉---Go的GORM查询

    查询

    //通过主键查询第一条记录
    db.First(&user)
    //// SELECT * FROM users ORDER BY id LIMIT 1;
    
    // 随机取一条记录
    db.Take(&user)
    //// SELECT * FROM users LIMIT 1;
    
    // 通过主键查询最后一条记录
    db.Last(&user)
    //// SELECT * FROM users ORDER BY id DESC LIMIT 1;
    
    // 拿到所有的记录
    db.Find(&users)
    //// SELECT * FROM users;
    
    // 查询指定的某条记录(只可在主键为整数型时使用)
    db.First(&user, 10)
    //// SELECT * FROM users WHERE id = 10;
    

    Where 条件

    普通 SQL

    // 获取第一条匹配的记录
    db.Where("name = ?", "jinzhu").First(&user)
    //// SELECT * FROM users WHERE name = 'jinzhu' limit 1;
    
    // 获取全部匹配的记录
    db.Where("name = ?", "jinzhu").Find(&users)
    //// SELECT * FROM users WHERE name = 'jinzhu';
    
    // <>
    db.Where("name <> ?", "jinzhu").Find(&users)
    
    // IN
    db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
    
    // LIKE
    db.Where("name LIKE ?", "%jin%").Find(&users)
    
    // AND
    db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
    
    // 时间
    db.Where("updated_at > ?", lastWeek).Find(&users)
    
    // BETWEEN
    db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
    
    

    Struct & Map

    // Struct
    db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
    //// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
    
    // Map
    db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
    //// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;
    
    // 主键的切片
    db.Where([]int64{20, 21, 22}).Find(&users)
    //// SELECT * FROM users WHERE id IN (20, 21, 22);
    
    

    提示 当通过结构体进行查询时,GORM将会只通过非零值字段查询,这意味着如果你的字段值为0,'', false 或者其他 零值时,将不会被用于构建查询条件,例如:

    db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
    //// SELECT * FROM users WHERE name = "jinzhu";
    

    你可以使用指针或实现 Scanner/Valuer 接口来避免这个问题.

    // 使用指针
    type User struct {
      gorm.Model
      Name string
      Age  *int
    }
    
    // 使用 Scanner/Valuer
    type User struct {
      gorm.Model
      Name string
      Age  sql.NullInt64  // sql.NullInt64 实现了 Scanner/Valuer 接口
    }
    

    选择字段

    Select,指定你想从数据库中检索出的字段,默认会选择全部字段。

    db.Select("name, age").Find(&users)
    //// SELECT name, age FROM users;
    
    db.Select([]string{"name", "age"}).Find(&users)
    //// SELECT name, age FROM users;
    
    db.Table("users").Select("COALESCE(age,?)", 42).Rows()
    //// SELECT COALESCE(age,'42') FROM users;
    
  • 相关阅读:
    gtest(C++单元测试框架)
    tinyXML入门
    笔记 解决vue3动态绑定本地图片失效问题
    面试技巧
    vuex 状态管理
    插槽的使用
    Vue-router 路由
    Vue组件
    (转)JS 常用 DOM
    9-26
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11445388.html
Copyright © 2011-2022 走看看