【Golang】sql.Null* 类型使用(处理空值和零值)

 sql.NullStringsql.NullInt64 类型(以及其他类似的 sql.Null* 类型)在处理数据库操作时非常有用,尤其是在 Go 语言的 database/sql 包中。它们的主要用途包括:

  1. 表示 NULL 值

    • 在数据库中,NULL 表示“没有值”。sql.Null* 类型允许你在 Go 语言中直接表示和处理这种“没有值”的状态,而不是使用 Go 的零值(如空字符串 "" 或整数 0)来表示 NULL,这样可以更准确地反映数据库中的数据状态。
  2. 数据库交互

    • 当你从数据库查询数据时,某些字段可能是 NULL。使用 sql.Null* 类型可以区分一个字段是真正包含零值还是 NULL。这对于后续的逻辑处理非常重要,因为零值和 NULL 在逻辑上可能有不同的含义。
  3. 避免错误

    • 如果不使用 sql.Null* 类型,你可能会错误地将数据库中的 NULL 值解释为 Go 语言中的零值,这可能导致逻辑错误或程序崩溃。
  4. 简化代码

    • 使用 sql.Null* 类型可以简化代码,因为你不需要编写额外的检查来确定一个值是否来自数据库中的 NULL。Valid 字段可以直接告诉你这个值是否有效。
  5. 数据完整性

    • 在将数据写入数据库时,sql.Null* 类型可以帮助你保持数据的完整性。你可以准确地标记哪些字段是有意设置为 NULL,哪些字段是具有实际值的。
  6. 灵活性

    • sql.Null* 类型提供了灵活性,允许你在不改变现有代码结构的情况下,处理那些可能为 NULL 的字段。

示例场景:

假设你正在处理一个用户信息表,其中有一个字段表示用户的出生日期。在某些情况下,用户可能没有提供出生日期,因此这个字段在数据库中是 NULL。使用 sql.NullStringsql.NullInt64(取决于出生日期如何存储)可以让你在 Go 程序中准确地表示这种情况,并在需要时进行适当的处理。

package mainimport ("database/sql""fmt"
)// DbBackedUser 用户结构体,由数据库支持
type DbBackedUser struct {Name sql.NullStringAge  sql.NullInt64
}func main() {// 空值var name sql.NullStringx := DbBackedUser{Name: name, Age: sql.NullInt64{Int64: 0, Valid: false}}// 输出结果fmt.Println("Name:")fmt.Println("String:", x.Name.String) // 输出: ""fmt.Println("Valid:", x.Name.Valid)   // 输出: falsefmt.Println("Age:")fmt.Println("Int64:", x.Age.Int64)  // 输出: 0fmt.Println("Valid:", x.Age.Valid)   // 输出: false
}
Name:
String: 
Valid: false
Age:
Int64: 0
Valid: false

加入与数据库交互

1. 创建测试表

clickhouse-client

首先,我们需要在 ClickHouse 中创建一个测试表。因为你的数据结构包含 NameAge,我们可以使用以下 SQL 语句创建表: 

CREATE TABLE test_table
(`Name` Nullable(String),`Age`  Nullable(Int64)
) ENGINE = Memory;

2. 插入数据

接下来,我们插入一些数据,包括空值和零值:

INSERT INTO test_table VALUES ('Kimi', 30), ('', 0), (NULL, NULL);

这里,我们插入了三行数据:

  • 第一行:Name 是 "Kimi",Age 是 30。
  • 第二行:Name 是空字符串,Age 是 0。
  • 第三行:Name 和 Age 都是 NULL。

3. 查询数据

查询表中的所有数据:

SELECT * FROM test_table;

package mainimport ("database/sql""fmt""log"_ "github.com/ClickHouse/clickhouse-go"
)// DbBackedUser 用户结构体,由数据库支持
type DbBackedUser struct {Name sql.NullStringAge  sql.NullInt64
}func main() {// 连接到 ClickHouse 数据库connStr := "tcp://localhost:9000?username=default&password=&database=default"db, err := sql.Open("clickhouse", connStr)if err != nil {log.Fatal(err)}defer db.Close()// 查询并打印现有的数据fmt.Println("Query results before insertion:")queryData(db)fmt.Println("查询并打印现有的数据")// 开始事务tx, err := db.Begin()if err != nil {log.Fatal(err)}// 空值var name sql.NullStringx := DbBackedUser{Name: name, Age: sql.NullInt64{Int64: 1, Valid: false}}// 插入数据_, err = tx.Exec("INSERT INTO test_table2 (Name, Age) VALUES (?, ?)", x.Name, x.Age)if err != nil {tx.Rollback() // 如果出现错误,回滚事务log.Fatal(err)}// 提交事务err = tx.Commit()if err != nil {log.Fatal(err)}// 查询并打印插入后的数据fmt.Println("Query results after insertion:")queryData(db)fmt.Println("查询并打印现有的数据")}func queryData(db *sql.DB) {rows, err := db.Query("SELECT Name, Age FROM test_table2")if err != nil {log.Fatal(err)}defer rows.Close()var nameValue sql.NullStringvar ageValue sql.NullInt64for rows.Next() {if err := rows.Scan(&nameValue, &ageValue); err != nil {log.Fatal(err)}fmt.Printf("name: %v, Age: %v\n", nameValue.String, ageValue.Int64)}
}

结果

这里

给数据库传了0值

改成true后

传值成功

NameValid改成false

传null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465631.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【昇腾】从单机单卡到单机多卡训练

昇腾:单机单卡训练->单机多卡训练 分布式训练 (1)单机单卡的训练流程 硬盘读取数据CPU处理数据,将数据组成一个batch传入GPU网络前向传播计算loss网络反向传播计算梯度 (2)PyTorch中最早的数据并行框…

【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

docker+nacos

安装数据库 以docker安装为例(实际建议实体) 初始化数据库 /******************************************/ /* 数据库全名 nacos_config */ /* 表名称 config_info */ /******************************************/ CREATE TABLE config_i…

边缘计算网关如何打造智慧变电站

随着工业化发展,电网规模持续扩大,电力终端设备的数量呈几何级数增长,由此产生了海量的数据传输和处理需求,不仅给服务器主站造成了巨大压力,并且过程中的高时延、高误差也无法满足智能化、自动化等新业务形态的要求。…

Uniapp安装Pinia并持久化(Vue3)

安装pinia 在uni-app的Vue3版本中,Pinia已被内置,无需额外安装即可直接使用(Vue2版本则内置了Vuex)。 HBuilder X项目:直接使用,无需安装。CLI项目:需手动安装,执行yarn add pinia…

(没有跳过联网激活)导致使用微软账号激活电脑---修改为本地账户和英文名字

修改为本地账户和英文名字 前言微软账号,本地账号与用户名基本知识账户管理方式一方式2 查看账户的sid并且修改文件夹名字和系统变量修改注册表和建立软件路径超链接注意事项总结 前言 当没有联网激活新买的电脑时候,这个就不用看了 当你是联网激活的时…

18、论文阅读:AOD-Net:一体化除雾网络

AOD-Net: All-in-One Dehazing Network 前言介绍相关工作物理模型传统方法深度学习方法 建模与扩展变换后的公式网络设计与高级特征任务相结合 除雾评价数据集和实现 前言 该论文提出了一种基于卷积神经网络(CNN)的图像去雾模型,称为 All-in…

[ DOS 命令基础 2 ] DOS 命令详解-网络相关命令

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

【docker】6. 镜像仓库/镜像概念

Docker Registry(镜像仓库) 什么是 Docker Registry 镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。 镜像仓库管理多个 Repository, Repository 通过命名来区分。…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意:运行前需要开启服务端口 如果运行看不到效果,设置下基础库选别的版本 配置

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关

1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…

【华为云-云驻共创】UCS跨云多活容灾:让业务高可用不再是难题

【摘要】云原生应用深入到企业各个业务场景,云原生正在走向分布式化,跨云跨域统一协同治理,保证一致应用体验,这些新的需求日益凸显。而容灾是确保服务高可用的保障,但即使应用部署在云上,也无法避免市政方…

R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等

R 语言的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。内容以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线,通过多个来自经…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中,我们介绍了Flutter中的隐式动画的一些相关知识,在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

数字马力二面面试总结

24.03.07数字马力二面面试总结 前段时间找工作,做的一些面试笔记总结 大家有面试录音或者记录的也可以发给我,我来整理答案呀 数字马力二面面试总结 24.03.07数字马力二面面试总结你可以挑一个你的最有挑战性的,有难度的,最具有复杂性的项目,可以简单说一下。有没有和算…

C语言例题练手(1)

前几篇博客的内容已经涉及了C语言的部分语法知识,我们可以尝试做一些编程题,或者换一种说法就是可以写出什么样的程序以此来解决一些问题。 题目来自牛客网https://www.nowcoder.com和C语言菜鸟教程C 语言教程 | 菜鸟教程 数值计算 【例1】带余除法计…

大模型LLama3!!!Ollama下载、部署和应用(保姆级详细教程)

首先呢,大家在网站先下载ollama软件 这就和anaconda和python是一样的 废话不多说 直接上链接:Download Ollama on Windows 三个系统都支持 注意: 这里的Models,就是在上面,大家点开之后,里面有很多模型…

【359】基于springboot的智慧草莓基地管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本智慧草莓基地管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree?1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

string模拟实现流插入(输出)+流提取(输入)

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 string模拟实现clear 模拟实现clear的目的是在流提取的时候我们清空之前的数据&#x…