首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

学习gorm系列三:深入理解Find函数的使用

下面是gorm中db相关的数据结构。如下: 大家看,在Statement结构中,实际上有两个字段,一个是Dest,即Find查询函数中的第一个参数,用来接收查询结果用的。...然后再解析Model以便解析出对应的表。当然,在解析Model时会判断该Model的类型是否是结构体类型,以及该结构体是否有对应的表。否则,就会跑出类型不支持,没有指定具体表的错误。...在一开始的时候,我们是通过指定了一个非切片类型的变量来接收查询结果的,但只接收到了一行数据。我们通过将两者的sql语句打印出来看看有什么区别。...*gorm.DB) *gorm.DB { return tx.Find(&rows) }) fmt.Printf("切片接收的sql语句:%s\n", rows_sql) //SELECT...这里要注意:Find函数如果在没有指定Where条件的情况下,都是全表扫描,最后根据接收参数是切片还是单条数组来提取扫描的结果而已。

2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【GORM实战剖析】基本用法和原理解析

    users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} db.Create(&users) 推荐: 通常:直接用结构体或结构体的切片进行创建...); 选择生效字段 = 核心结构体 + 字段数组 在 查询 和 更新 接口里,我推荐的使用方法是采用核心结构体User+一个fields的数组,前者保存具体的数据、也实现了结构体复用,后者则选择生效的字段...所以,在我的推荐使用方式里,区分了两种场景: 简单场景 - 核心结构体 + 字段数组 复杂场景 - 原生SQL 聚焦微服务的场景 作为一个ORM工具,GORM要考虑兼容各种SQL语句,内部非常庞大的。...= nil { db.AddError(err) return } defer rows.Close() // 将结果输出到目标结构体中 gorm.Scan...: reflect导致的底层的性能不高(这点还能接受) interface{}如果传入了不支持的复杂数据类型时,排查问题麻烦,往往要运行程序时才会报错 高频拼接重复SQL - 在一个程序运行过程中,执行的

    3.3K30

    GORM CRUD 10 分钟快速上手

    如果想更改表名,可以通过在模型结构体上添加 TableName() 方法来自定义表名称。...func (Good) TableName() string { return "tb_good" } 如果想更改表字段名,可在模型结构体上通过 gorm tag 的 column 标签指定。...var names []string db.Model(&User{}).Pluck("name", &names) 如果是一条记录的某个字段,可以使用单个变量而非切片接收查询结果。...预加载时,需要在模型的定义中体现这种关系,比如上面示例中 User 定义中有一个订单的切片,预加载时指定切片名称。 条件预加载 GORM 允许预加载时使用条件,其工作原理类似于内联条件。..., "%jinzhu%") // DELETE from emails where email LIKE "%jinzhu%"; 要有效删除大量记录,请将带有主键的切片传递给 Delete 方法。

    69830

    Go gorm

    ,并且透过一些工具或套件(例如:pymysql)向 SQL 资料库来做沟通。...表名:默认情况下,GORM 将结构体名称转换为 snake_case 并为表名加上复数形式。 例如,一个 User 结构体在数据库中的表名变为 users 。...列名:GORM 自动将结构体字段名称转换为 snake_case 作为数据库中的列名。时间戳字段:GORM使用字段 CreatedAt 和 UpdatedAt 来自动跟踪记录的创建和更新时间。...只有在目标 struct 是指针或者通过 db.Model() 指定 model 时,该方法才有效。 此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。..., "%jinzhu%")// DELETE from emails where email LIKE "%jinzhu%";可以将一个主键切片传递给Delete 方法,以便更高效的删除数据量大的记录govar

    12610

    Go 每日一库之 copier

    简介 上一篇文章介绍了mergo库的使用,mergo是用来给结构体或map赋值的。mergo有一个明显的不足——它只能处理相同类型的结构!如果类型不同,即使字段名和类型完全相同,mergo也无能为力。...除此之外,copier还能: 调用同名方法为字段赋值; 以源对象字段为参数调用目标对象的方法,从而为目标对象赋值(当然也可以做其它的任何事情); 将切片赋值给切片(可以是不同类型哦); 将结构体追加到切片中...顺带一提,作者是国人jinzhu大佬,如果你想找一个 Go 语言的 ORM 库,gorm你值得拥有!...将结构赋值到切片 这个不难,实际上就是根据源对象生成一个和目标切片类型相符合的对象,然后append到目标切片中: type User struct { Name string Age int...是 3 个元素,能更清楚的看出切片到切片是append的,目标切片原来的元素还是保留的。

    1.8K30

    客服系统即时通讯IM开发(六)Glang Gorm 执行原生Sql语句增删改查封装库【唯一客服】网站在线客服系统

    在开发在线客服系统的时候,有某些地方需要使用脚本去批量执行SQL语句,这个时候就需要使用简单的执行SQL的封装函数了 查询操作是使用的原生的sql库,没用Gorm,原因是Gorm的Raw Scan必须要定义好结构体...,原生的可以不需要了。...数据库连接(使用gorm.Open) 执行查询语句(使用rows.Scan) 执行增删改语句(使用db.Exec) 执行SQL文件(读取文件内容,执行每个分号分隔的SQL语句) package lib...= nil { return result, err } //获取列名 columns, _ := rows.Columns() //定义一个切片,长度是字段的个数...,切片里面的元素类型是sql.RawBytes values := make([]sql.RawBytes, len(columns)) //定义一个切片,元素类型是interface{

    41010

    Go ORM 干啥的?

    从系统结构上来看,采⽤ORM的系统⼀般都是多层系统,系统的层次多了,效率就会降低。ORM是⼀种完全的 ⾯向对象的做法,⽽⾯向对象的做法也会对性能产⽣⼀定的影响。...,而是deleted_at 会更新删除时间 db.Delete(&uu) } 使用gorm必须要先创建好数据库 gorm会自动创建数据表,且表结构可以动态变化 gorm创建的表命名方式为 代码中结构体命名的转换..., 例如 结构体命名为UserInfo,则table会命名为user_infos gorm修改表结构非常的容易 gorm是完全面向对象的思想 3 模型定义 模型是标准的 struct,由 Go 的基本数据类型...将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。...指定结构体查询字段 获取详情 指定结构体查询字段 当使用结构体进行查询时,你可以使用它的字段名或其 dbname 列名作为参数来指定查询的字段,例如: db.Where(&User{Name: "jinzhu

    2.9K40

    学习gorm系列十:使用gorm.Scopes函数复用查询逻辑

    今天要学习的是gorm.Scopes函数的使用。该函数的作用就是复用查询条件。 gorm Scopes是什么 在项目中,你一定会遇到过很多需要复用的查询条件。...1000 的已付款或已发货订单 db.Scopes(AmountGreaterThan1000, OrderStatus([]string{"paid", "shipped"})).Find(&orders...Scopes函数只是简单的将func (db *gorm.DB) *gorm.DB放到Statement.scopes这个切片中。...最后,在最终执行的时候,会循环遍历Statement.scopes切片,依次执行该切片中的每一个func (db *gorm.DB) *gorm.DB函数。...在我们的系统中,会遇到这样的场景:一些数据只能自己查看或操作;或者你的上级也能查看或操作;或者同部门的人员能查看或操作自己部门的数据,但不能查看或操作其他部门的权限;又或者只能查看同部门的数据但不能操作同部门的数据等等

    75810

    学习gorm系列四:Find、Take、First和Last函数的区别

    在gorm中,要想从数据库中查找数据有多种方法,可以通过Find、Take和First来查找。但它们之间又有一些不同。本文就详细介绍下他们之间的不同。...: 最终结果数据:[{Id:6 Name:}] 所以,Last和First的相同点在于只扫描到表的一条目标数据后就截止了,并赋值给接收变量。...我们首先给Find函数传递一个普通的非切片变量,如下: func main() { dsn := "username:password@tcp(127.0.0.1:3306)/test01?...扫描的是整个表,获取的也是表的所有数据,但因为接收者是一个非切片变量,所以最终只接收了一行数据到row中。...我们再来看看给Find传递一个切片变量来接收的情况: func main() { dsn := "username:password@tcp(127.0.0.1:3306)/test01?

    1.5K50

    Go 中的泛型:激动人心的突破

    方法 Trasforms 会以第一个参数化数值类型 S 作为切片基数的切片,并将其转换为以第二个参数化数字类型 T 作为切片基数的切片。...简而言之,如果我们想将一个整数切片转换成一个浮点切片,我们会像在 main 函数中所做的那样调用这个方法。 我们函数的非泛型替代方法需要一个整数切片并返回一个浮点切片。...两种方法的执行时间几乎一样,也就是说使用泛型不会影响我们应用程序的性能。但是它对结构(struct)有影响吗?我们尝试一下。现在,我们将使用结构并将方法附加到它们上。...(老实说,在所有示例中,我更喜欢 interface{}而不是 any,因为我的 Goland IDE 不支持新的保留字(any、comparable),然后我的 IDE 中出现了大量错误消息,自动完成也不能用了...每个 T 类型仅在这个方法的作用域(或结构及其方法)中定义,我们不会在其作用域之外谈论相同的 T 类型。我们可以用不同的方法重复同一个字母,类型仍然是相互独立的。

    48850

    Gorm-自定义查询(二)

    注意事项在使用自定义查询方法时,需要注意以下几点:自定义查询方法的第一个参数必须是*gorm.DB类型的对象,该对象表示查询的数据库连接。...自定义查询方法返回的类型必须是*gorm.DB类型的对象,以便可以在查询语句中继续使用。自定义查询方法不能包含无法被Gorm解析的语法,例如纯SQL语句或原始查询参数。...在主函数中,我们调用了该自定义查询方法,并将结果存储在一个名为"users"的切片中。...package mainimport ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm")type User struct { ID...然后,我们使用自定义查询方法FindByName来查询名字为"Tom"的用户,并将结果存储在users切片中。最后,我们输出了查询结果。

    61231

    Gorm框架学习--入门

    struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成 例如: type User struct { ID uint...默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间 遵循 GORM 已有的约定...---- gorm.Model GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt // gorm.Model 的定义 type...DeletedAt gorm.DeletedAt `gorm:"index"` } 您可以将它嵌入到您的结构体中,以包含这几个字段,具体怎么嵌入,下面会说到。..., // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change

    2.1K10

    Go语言微服务框架 - 4.初识GORM库

    v0.4.0:引入GORM库 项目链接 https://github.com/Junedayday/micro_web_service/tree/v0.4.0 目标 利用GORM实现简单的增删改查功能。...2个特点: 尽可能简单,不要出现魔法变量,比如常量字符串 不要让框架强约束表结构的设计,也是为了后续迁移框架、甚至语言时成本更低 查询 中文文档链接 - https://gorm.io/zh_CN/docs...,体验会好很多 // 但是,上面这种方法不支持结构体中Field为默认值的情况,如0,'',false等 // 所以,更推荐采用下面这种方式,虽然会带来一定的hard code,但能指定要查询的结构体名称..., true).Update("name", "hello") // 不推荐:指定主键的多字段更新,但不支持默认类型 db.Model(&user).Updates(User{Name: "hello...Go语言提供的各类组件,很多都是开源社区对传统服务或云原生理念的自我实践,没有绝对的正确与错误。 **那如今社区上的那些微服务框架都不值一提吗?**并不是。

    1.5K20

    Gorm 入门介绍与基本使用

    1.4 ORM解析过程 ORM框架的解析过程包括以下步骤: 1.4.1 模型定义 开发者需要定义数据模型,通常是一个结构体,表示数据库中的表结构。...1.4.2 数据验证 ORM框架通常提供了数据验证的功能,确保数据的合法性和完整性。 1.4.3 映射关系 ORM框架会建立数据模型与数据库表之间的映射关系,将结构体的字段与表的列进行对应。...Gorm的设计目标是简洁而强大,使得开发者能够更轻松地进行数据库操作。...在使用 TiDB 时有一些值得注意的内容: 您可以在结构体中使用 gorm:"primaryKey;default:auto_random()" 标签从而调用 TiDB 的 AUTO_RANDOM 功能...:= logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)

    82510
    领券