首页 > 其他分享 >11-gorm-v2-03-基本查询

11-gorm-v2-03-基本查询

时间:2023-06-28 13:57:15浏览次数:37  
标签:11 03 LiuBei users db v2 user Find name

@

目录

1. 简单示例

从一个示例开始说明

  • 以有表格如下
mysql> select * from xi_shu;
+----+------------+------+
| id | name       | age  |
+----+------------+------+
|  1 | LiuBei     |   28 |
|  2 | GuanYu     |   22 |
|  3 | ZhangFei   |   20 |
+----+------------+------+
6 rows in set (0.00 sec)
  • 代码
package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"time"
)

type User struct {
	ID int64
	Age int64
	Name string
}



func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
	var users []User

	db.Find(&users)
	fmt.Println(users)

}

func connect() (db *gorm.DB,sqlDB *sql.DB,err error) {
	dsn := "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	sqlDB,_ = db.DB()
	if err != nil {
		fmt.Printf(err.Error())
		defer sqlDB.Close()
	}else {
		fmt.Printf("OK\n")
		sqlDB.SetMaxIdleConns(10)
		sqlDB.SetMaxOpenConns(100)
		sqlDB.SetConnMaxLifetime(time.Hour)
	}
	return
}
  • 输出结果如下
OK
[{1 28 LiuBei} {2 22 GuanYu} {3 20 ZhangFei}]

2. 基本查询

2.1 获取第一条记录,按主键排序

db.First(&user)
//// SELECT * FROM users ORDER BY id LIMIT 1;

2.2 获取一条记录,不指定排序

db.Take(&user)
//// SELECT * FROM users LIMIT 1;

2.3 获取最后一条记录,按主键排序

db.Last(&user)
//// SELECT * FROM users ORDER BY id DESC LIMIT 1;

2.4 获取所有的记录

db.Find(&users)
//// SELECT * FROM users;

2.5 通过主键进行查询 (仅适用于主键是数字类型)

db.First(&user, 2)
//// SELECT * FROM users WHERE id = 10;

2.6 查询指定字段

db.Select("name,age").Find(&users)
  • 示例
func main() {
	db,_ := connect()
	defer db.Close()
	var users []xiShu
	db.Select("name,age").Find(&users)
	fmt.Println(user)
}
  • 示例(利用切片)
db.Select([]string{"name", "age"}).Find(&users)

3. where

3.1 原生sql

3.1.1 简单使用

  • 语法
db.Where("name = ?", "LiuBei").First(&users)
//// SELECT * FROM users WHERE name = 'LiuBei' limit 1;
  • 示例1
    "1. 简单示例"中 main函数替换如下:
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
	var users []User

	db.Where("name = ?", "LiuBei").First(&users)
	fmt.Println(users)

	db.Where("name = ?", "GuanYu").First(&users)
	fmt.Println(users)
}

查询结果:

OK
&[{1 LiuBei 28}]
&[{2 GuanYu 22}]
  • 示例2
    如果连续查询用结构体收数据
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
	var user  User

	db.Where("name = ?", "LiuBei").First(&user)
	fmt.Println(user)

	db.Where("name = ?", "GuanYu").First(&user)
	fmt.Println(user)
}

输出为

OK
{1 28 LiuBei}

2022/02/11 23:54:54 /data/goproject/src/crow-gorm/main.go:29 record not found
[0.796ms] [rows:0] SELECT * FROM `users` WHERE name = 'GuanYu' AND `users`.`id` = 1 ORDER BY `users`.`id` LIMIT 1
{1 28 LiuBei}

报错可见"WHERE name = 'GuanYu' AND `users`.`id` = 1 ",说明第一次查到的结果会带到第二次查询

试了一下,如果第二次查询之前清除结构体数据,则可以第二次查询

func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
	var user  User

	db.Where("name = ?", "LiuBei").First(&user)
	fmt.Println(user)

	user = User{} //清除user

	db.Where("name = ?", "GuanYu").First(&user)
	fmt.Println(user)
}

3.1.2 <> (不为)

db.Where("name <> ?", "LiuBei").Find(&users)

3.1.3 IN

db.Where("name in (?)", []string{"CaoCao","LiuBei","SunQuan"}).Find(&users)

3.1.4 LIKE

db.Where("name LIKE ?", "%Liu%").Find(&users)

3.1.5 AND

db.Where("name = ? AND Age > ? ", "LiuBei",20).Find(&users)

3.1.6 BETWEEN

db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)

3.1.7 Time

db.Where("updated_at < ?", currentTime).Find(&users)

3.2 通过go的对象查询

3.2.1 通过Struct查询

  • 语法
db.Where(STRUCT_NAME).First(&users)
  • 示例
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()

	user := User {
		Name: "GuanYu",
		Age: 22,
	}
	db.Where(user).First(&user)
	fmt.Println(user)
}

3.2.2 通过Map查询

db.Where(map[string]interface{}{"name": "GuanYu", "age": 22}).Find(&users)

3.2.3 注意问题

  • 值为0''false 该字段不会被用于构建查询条件
func main() {
	db,_ := connect()
	defer db.Close()
	var users []User

	result := db.Where(map[string]interface{}{"name": 0, "age": 20}).Find(&users)
	fmt.Println(users)
}

结果

OK
[{3 ZhangFei 20} {5 ZhuGeLiang 20} {6 MaChao 20}]

可见,name的值为0,ID为空也不会,都不写入sql语句。

4. Not

和WHERE类似,不展开讲述了

  • 获取过滤后第一条记录,按主键排序
db.Not("name", "LiuBei").First(&user)
//// SELECT * FROM users WHERE name <> "LiuBei" LIMIT 1;
  • 用数组/切片过滤
db.Not("name", []string{"CaoCao", "LiuBei","SunQuan"}).Find(&users)
//// SELECT * FROM users WHERE name NOT IN ("CaoCao", "LiuBei","SunQuan");
  • 不在主键 slice 中
db.Not([]int64{1,2,3}).First(&user)
//// SELECT * FROM users WHERE id NOT IN (1,2,3);

示例

func main() {
	db,_ := connect()
	defer db.Close()
	var users []User

	result := db.Not([]int64{1,2,3}).Find(&users)
	fmt.Println(users)
}

结果

[{4 ZhaoYun 18} {5 ZhuGeLiang 20} {6 MaChao 20}]

如上可知,ID是1.2.3的被过滤

  • 原生 SQL
db.Not("name = ?", "LiuBei").First(&user)
//// SELECT * FROM users WHERE NOT(name = "LiuBei");
  • Struct/Map
db.Not(map[string]interface{}{"name": "LiuBei", "age": 20}).Find(&users)
//// SELECT * FROM users WHERE name <> "LiuBei";

5. Or

连接两个条件,两边可以是不同写法,如一边是原始sql一边是结构体:

db.Where("name = ?", "LiuBei").Or(xiShu{Name: "GuanYu"}).Find(&users)

6. 行内条件查询

  • 非数字型主键查询
db.First(&user, 2)
//// SELECT * FROM users WHERE id = 23 LIMIT 1;

示例

func main() {
	db,_ := connect()
	defer db.Close()
	var users []User
	result := db.First(&users, 2)
	fmt.Println(users)
}
  • 主键查询(数字/非数字型)
db.First(&user, "id = ?", "xxxx")
//// SELECT * FROM users WHERE id = 'xxxxx' LIMIT 1;
  • 原生 SQL
db.Find(&users, "name = ?", "LiuBei")
//// SELECT * FROM users WHERE name = "LiuBei";
db.Find(&users, "name <> ? AND age > ?", "LiuBei", 20)
//// SELECT * FROM users WHERE name <> "LiuBei" AND age > 20;
  • Struct
db.Find(&users, User{Age: 20})
//// SELECT * FROM users WHERE age = 20;
  • Map
db.Find(&users, map[string]interface{}{"age": 20})
//// SELECT * FROM users WHERE age = 20;

标签:11,03,LiuBei,users,db,v2,user,Find,name
From: https://www.cnblogs.com/crow1840/p/17511195.html

相关文章

  • 11-gorm-V2-04-高级查询
    @目录1.用Struct或Map接收数据1.1Find到Struct1.2Find到Map2.子查询3.Group/Having3.1Group完整示例3.2Having4.变量4.1使用sql.Named定义4.2使用map定义变量5.用Rows()迭代6.查钩子7.Pluck(单列查询)8.Scopes(调用查询函数)8.1使用8.2示例9.Count1.用Struct或Map......
  • P4Spring-02-Spring系统架构与Spring-03-核心概念
    Spring-02-Spring系统架构StringFramework是Spring生态圈中最基础的项目,也是其他项目的根基 CoreContainer:核心容器 AOP:面向切面编程Aspects:AOP思想实现 DataAccess:数据访问DataIntegration:数据集成(集成:与其他技......
  • 11-gormV2-07-删除
    1.按主键删除1.1使用说明如果指定的不是主键,则会触发批量删除,但是没有Where的批量删除被gorm禁止。样例db.Delete(&User{ID:2})或写做db.Delete(&User{ID:2},2)1.2完整示例删除id=2的一行packagemainimport( "database/sql" "fmt" "gorm.io/driver/m......
  • 二、Windows11平台下Visual Studio 2022配置32位汇编环境
    1.下载VisualStudio20222.安装选择工作负载3.创建新项目3.1选择空项目模板3.2填写项目名称和解决方案项目名称:实际项目名称解决方案名称:一个解决方案下可以管理多个项目,并且可以选择一个项目为启动项目,当点击运行与调试后,就会启动被选择为启动项目的项目3.3实......
  • mysql系列基础篇03----约束
    一、概述1、概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据2、目的:保证数据库中数据的正确,有效性和完整性。3、分类  二、约束演示创建一个用户表createtablemyuser(idintprimarykeyauto_incrementcomment'主键',namevarchar(10)notnulluniq......
  • FX110网WeTrade众汇平台:交易者应该使用 MT4 还是 MT5?
    比较MT4和MT5是许多外汇交易者感兴趣的话题。这两款软件均由MetaQuotes开发,广泛应用于外汇交易行业。尽管两者都提供交易工具和功能,但它们之间存在重要差异。在本文中,FX110网上的交易商WeTrade众汇平台将探讨和比较MT4和MT5,以帮助您选择适合您的交易需求和目标的软件。MT4和M......
  • 03-定时器与数码管
    目录一.定时器基础概念一.定时器基础概念时钟周期时钟周期T是时序中最小的时间单位,具体计算的方法就是1/时钟源频率,例如C51时钟周期=1/11059200秒机器周期指单片机完成一个操作的最短时间.机器周期主要针对汇编语言而言,每条语句都是机器周期的整数倍.一......
  • 编程初学者入门11_井字棋游戏、进制转换、订闹钟(时间换算)
    一、井字棋游戏题目描述KiKi和BoBo玩“井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。输入描述:三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表......
  • PTA实验实验7~11的总结及分析
    1.前言自上次的博客又过去了一个多月,经过一段时间对Java的学习我们也迎来了期末考试了。这几次pta是期末前的最后几次pta,考察了菜单程序和课程程序,难度较之前有所提升,在下面分析一下。2.设计与分析7-1菜单计价程序-5首先是这道题,本题在菜单计价程序-3的基础上增加了部分内容,......
  • PTA7-11总结
     一.前言PTA-7考察了菜单计价程序的迭代,主要考察类的基本结构设计,对输入字符串进行处理,对输入时间的处理,以及对输入的不同类型的菜品数据分类处理,难点在于输入数据的处理和判断输入异常,难度一般,题量少。PTA-8考察了课程成绩统计程序的第一次,主要考察一些类基本的结构设计,一些......