• 业精于勤荒于嬉---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;
    
  • 相关阅读:
    Elastic Stack之FileBeat使用实战
    Elastic Stack之Logstash进阶
    Elastic Stack之Logstash
    Elastic Stack之Elasticsearch 5.6.12 集群部署实战
    CentOS安装操作系统级初始优化
    Elastic Stack之搜索引擎基础
    ansible基础-ansible角色的使用
    ansible基础-playbook剧本的使用
    ansible基础-ansible的安装和常用模块介绍
    运维开发笔记整理-使用序列化
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11445388.html
Copyright © 2020-2023  润新知