[Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别

这篇具有很好参考价值的文章主要介绍了[Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

当我在gorm中使用原生sql操作数据库时,时常用raw() 和 exec() ,有时候经常遇到数据插不进去或者 数据帮i当不到结构体,原来是 这两个方法有不同的用处和特点

分析解决

DB.Raw()

个人理解: 需要查询数据 映射到结构体时使用
官方理解:

DB.Raw() 方法用于执行原始 SQL 查询语句或可执行的命令。它可以执行任意的 SQL 语句,并返回查询结果或影响的行数。
DB.Raw() 方法返回的是 *sql.Rows 结果集对象,通过调用 .Scan() 方法可以将查询结果映射到相应的结构体中。
由于直接执行原始 SQL,所以需要手动处理 SQL 注入、参数绑定和结果集映射等问题。

示例代码:

row := DB.Raw("SELECT * FROM users WHERE age > ?", 18).Row()
var user User
row.Scan(&user.Name, &user.Age)

DB.Exec()

个人理解: 当增删改表中数据的时候使用,不映射到结构体中
官方理解:
B.Exec()

DB.Exec() 方法用于执行原始 SQL 语句或可执行的命令。它不返回查询结果,而是返回一个 *sql.Result
对象,其中包含了执行结果的信息,例如受影响的行数。 DB.Exec() 方法通常用于执行 INSERT、UPDATE、DELETE
等修改操作,并用于判断操作是否成功。

go

result := DB.Exec("UPDATE users SET name = ? WHERE id = ?", "John", 1)
rowsAffected, err := result.RowsAffected()

两者区别

DB.Raw() 返回 *sql.Rows 结果集对象,需要手动处理结果集的扫描和映射。
DB.Exec() 返回 *sql.Result对象,主要用于获取执行结果的信息。 在使用这两个方法时,需要注意以下事项:

由于原始 SQL 可能带来安全风险,请确保输入的数据经过正确的验证和转义,以防止 SQL 注入攻击。 在使用 DB.Raw() 或
DB.Exec() 方法之前,确保已经建立了有效的数据库连接,并且对应的数据库表和列名存在且拼写正确。

综上所述,DB.Raw() 和 DB.Exec() 都是 GORM 中执行原始 SQL 操作的方法,但在返回结果和使用方式上有所不同。选择使用哪个方法取决于你的具体需求和操作类型。文章来源地址https://www.toymoban.com/news/detail-537605.html

到了这里,关于[Golang实战] gorm中使用Raw()和 Exec() 两种方式操作sql原生语句的特点和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • golang使用os/exec库查询进程

    本文主要介绍如何使用os/exec库查询进程。 输出: 上述代码逻辑会获取到当前系统中所有运行的进程,但如果只需要获取制定进程信息呢,就需要针对进程进行过滤。 第一种方式: 输出: 第二种方式: 输出:

    2024年02月11日
    浏览(33)
  • Golang+Gorm库使用踩坑——未标识primarykey导致创建后无法返回修改

    做毕设ing,基本的增删改查。 这里是一个需要增的地方,代码如下: 我在外层调用时候,是需要返回新增记录的ID。但是无法符合预期。通过打印发现,我这里返回的id就是0。 翻阅之前写的一个正确样例,对比发现 区别在于,我这里没有去指定主键。 根据官方文档,其de

    2024年01月19日
    浏览(38)
  • MyBatis-plus中的两种快捷操作数据库方式:1、mapper调用 2、ActiveRecord方式(简称AR) 二者的使用和区别介绍

            在使用MyBatis操作数据库时,需要频繁的写mapper层dao接口以及对应的配置文件和SQL语句,当功能方法繁杂,业务逻辑不复杂的时候,我们可以使用MyBatis的升级版MyBatis-Plus来代替我们写这些繁琐的配置文件和简单的SQL。 (1)书写或使用MP生成数据库表对应的实体类。

    2024年02月07日
    浏览(61)
  • 使用 GORM 连接数据库并实现增删改查操作

    首先,我们需要安装 GORM 包。在终端中运行以下命令: shell go get -u gorm.io/gorm 在 Go 代码的开头导入以下包: 在代码中建立数据库连接,示例中使用 MySQL 数据库作为示范: 请确保替换 user 、 password 和 dbname 为你的实际数据库凭据和名称。 在 GORM 中,我们需要定义模型结构来

    2024年02月15日
    浏览(51)
  • Vue实战:两种方式创建Vue项目

    本实战教程详细演示了如何通过Node.js LTS版本安装Vue CLI脚手架工具,以及使用命令行和IntelliJ IDEA两种方式创建、配置并运行一个基于Vue 3的前端项目。首先,用户需下载安装Node.js LTS版本,并确保npm包管理器能全局访问。接着利用npm全局安装Vue CLI,创建Vue项目目录,并在命令

    2024年01月19日
    浏览(35)
  • Golang Gorm 一对多查询 preload预加载

     GORM允许使用  Preload 通过多个SQL中来直接加载关系, 例如: 其实很简单, 你要preload  user表 的数据,gorm就提前把这张表全部取出来,然后再执行 First 或 Find 这样的方法去查询主数据,最后把两种数据通过外键关联一一对应起来。 其实preload也就是做了两次查询。    有了

    2024年02月11日
    浏览(38)
  • 实战:单点登录的两种实现方式,附源码

    最近工作有点忙,好久没更新文章了,正好这两天在整理 单点登陆 相关的文档,今天趁着小孩睡着了🤫,赶紧码一篇 实战文 交差。 单点登录( Single Sign-On , SSO )是一种身份验证服务,允许用户使用单个标识来登录多个应用程序或系统。如下图所示,用户只需要 用户名

    2024年02月08日
    浏览(51)
  • 开源 Golang 微服务入门三:ORM 框架 GORM

    前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开

    2024年02月14日
    浏览(33)
  • Golang Gorm 更新字段 save、update、updates

    更新和删除操作的前提条件都是要在找到数据的情况下,先要查询到数据才可以做操作。 更新的前提的先查询到记录, Save保存所有字段,用于单个记录的全字段更新 ,它会保控所有字段,即使零值也会保存。 在更新和删除之前,要利用之前学的查询语句先查询到数据,再

    2024年02月03日
    浏览(29)
  • SSRS开发的两种方式(VS中集成SSDT组件的开发方式)和(sql server端SSDT的开发方式)//Dynamics 365 开发reports的两种方式

    下载 SQL Server Data Tools (SSDT) for Visual Studio SQL Server Data Tools (SSDT) 是一款新式开发工具,用于生成 SQL Server 关系数据库、Azure SQL 数据库、Analysis Services (AS) 数据模型、Integration Services (IS) 包和 Reporting Services (RS) 报表。 使用 SSDT,你可以设计和部署任何 SQL Server 内容类型,就像在

    2024年02月11日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包