go gorm 查询

这篇具有很好参考价值的文章主要介绍了go gorm 查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 定义model
package mysqltest

import (
	"errors"
	"fmt"

	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	ID    uint    `gorm:"primarykey"`
	Name  string  `gorm:"column:name"`
	Price float64 `gorm:"column:price_value"`
	Test  string  `gorm:"-"`
}

type Tabler interface {
	TableName() string
}

// 修改表名
func (recv Product) TableName() string {
	return "product"
}

// 钩子
func (recv *Product) BeforeCreate(tx *gorm.DB) (err error) {
	if recv.Name == "haha" {
		fmt.Println("不合法哈")
		return errors.New("不合法哈")
	} else {
		return nil
	}
}

  1. helper
package mysqltest

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

var db *gorm.DB

func Initdb() {
	dsn := "ellis:ellis@tcp(192.168.214.134:3306)/go_db?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
}

func Create(value interface{}) {
	d := db.Create(value)
	fmt.Printf("d.RowsAffected: %v\n", d.RowsAffected)
}

func InitTable(table interface{}) {
	db.AutoMigrate(table)
}

// 根据选择的字段插入
func CreateBySelectFields(fields []string, value interface{}) {
	db.Select(fields).Create(value)
}

// 批量插入
func CreateMulti(value interface{}) {
	d := db.Create(value)
	fmt.Printf("d.RowsAffected: %v\n", d.RowsAffected)
}

// 批量插入
func CreateBatch(value interface{}) {
	d := db.CreateInBatches(value, 100)
	fmt.Printf("d.RowsAffected: %v\n", d.RowsAffected)
}

// 忽略钩子
func CreateIgnoreHook(value interface{}) {
	db.Session(&gorm.Session{SkipHooks: true}).Create(value)
}

// 通过map创建
func CreateByMap(value map[string]interface{}, model interface{}) {
	db.Model(model).Create(value)
}

// 冲突啥也不做
func DoNothingWhenInsert(value interface{}) {
	db.Clauses(clause.OnConflict{DoNothing: true}).Create(value)
}

// 通过主键查找
func FindByKey(value interface{}) {
	db.Find(value, 1)
}

// 查找后映射到map类型
func FindAndConvertToMap(value interface{}, result *map[string]interface{}) {
	db.Model(value).First(result)
}

// 多主键查找
func FindByMultiKey(value interface{}, keys []int) {
	db.Find(value, keys)
}

// 条件查找
func FindByCondition(value interface{}) {
	db.Where("name=?", "haha").Order("id desc").Find((value))
}

// struct 查找,会忽略0值,例如传入ID=0,这个ID=0不会作为查询条件
func FindByStruct(value interface{}, condition interface{}) {
	db.Where(condition).Find(value)
}

// 指定结构体查询字段
func FindByStructWithReturnFields(value interface{}, condition interface{}, returnFields ...string) {
	db.Where(condition, returnFields).Order("id desc").Find(value)
}

  1. main
package main

import (
	"ellis/mysqltest"
	"fmt"
)

func main() {
	mysqltest.Initdb()
	// 创建数据库
	mysqltest.InitTable(&mysqltest.Product{})

	var value mysqltest.Product

	mysqltest.FindByKey(&value)

	fmt.Printf("value: %v\n", value)

	// 映射到map
	result := map[string]interface{}{}

	mysqltest.FindAndConvertToMap(mysqltest.Product{}, &result)
	fmt.Printf("result: %v\n", result)

	// 多主键查找
	var products1 []mysqltest.Product

	mysqltest.FindByMultiKey(&products1, []int{1, 2, 3})

	for _, v := range products1 {
		fmt.Printf("v: %v\n", v)
	}

	// 条件查找
	var products2 []mysqltest.Product

	mysqltest.FindByCondition(&products2)

	for _, v := range products2 {
		fmt.Printf("v: %v\n", v)
	}
	// struct 查找
	var products3 []mysqltest.Product
	// ID 为0的被忽略
	produce := mysqltest.Product{Name: "haha", ID: 0}
	mysqltest.FindByStruct(&products3, produce)
	for _, v := range products3 {
		fmt.Printf("v: %v\n", v)
	}
	// map 查找
	var products4 []mysqltest.Product
	// ID 为0的被忽略
	produce1 := map[string]interface{}{"Name": "haha", "ID": 0}
	mysqltest.FindByStruct(&products4, produce1)
	for _, v := range products4 {
		fmt.Printf("v: %v\n", v)
	}

	// struct 查找,可以设置使用的struct的key
	var products []mysqltest.Product
	// ID 为0的被忽略
	produce2 := mysqltest.Product{Name: "haha"}
	mysqltest.FindByStructWithReturnFields(&products, produce2, "name", "id")
	for _, v := range products {
		fmt.Printf("v: %v\n", v)
	}
}

https://gorm.io/docs/query.html

https://gorm.io/docs/advanced_query.html文章来源地址https://www.toymoban.com/news/detail-667189.html

到了这里,关于go gorm 查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

    OpenTelemetry中文文档:https://github.com/open-telemetry/docs-cn/blob/main/OT.md 之前用的是jaeger实现链路追踪,但是想要换成Zipkin等框架或集成指标监控或集成日志会换框架很麻烦。 OpenTracing制定了一套平台无关、厂商无关的协议标准,使得开发人员能够方便的添加或更换底层APM的实现。

    2024年02月06日
    浏览(30)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(50)
  • 【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关

    2023年04月21日
    浏览(48)
  • 【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(55)
  • 【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(45)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(68)
  • Golang区块链钱包_go语言钱包

    Golang区块链钱包的特点 Golang区块链钱包具有以下几个特点: 1. 高性能 Golang是一种编译型语言,具有快速的执行速度和较低的内存消耗。这使得Golang区块链钱包在处理大规模交易数据时表现出色,能够满足高性能的需求。 2. 并发支持 Golang内置了轻量级线程——goroutine,以及

    2024年04月15日
    浏览(47)
  • 【GoLang】哪些大公司正在使用Go语言

    前言: 随着计算机科学和软件开发的快速发展,编程语言的选择变得愈加关键。 在这个多元化的编程语境中,Go语言(简称Golang)以其简洁、高效、并发处理能力等特性逐渐受到业界关注。 越来越多的大型科技公司纷纷采用Go语言作为其软件开发的首选语言,这种趋势反映了

    2024年02月04日
    浏览(51)
  • Golang(Go语言)IP地址转换函数

    String形式的IP地址和Int类型互转函数 代码 输出如下:  

    2024年02月05日
    浏览(40)
  • 【Go语言】Golang保姆级入门教程 Go初学者chapter3

    下划线“_”本身在Go中一个特殊的标识符,成为空标识符。可以代表任何其他的标识符,但是他对应的值就会被忽略 仅仅被作为站维度使用, 不能作为标识符使用 因为Go语言中没有private public 所以标记变量首字母大写代表其他包可以使用 小写就是不可使用的 注意:Go语言中

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包