【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.xdnf.cn/news/5307.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

wincc中全局脚本C(c语言脚本)的研究和解密

文章目录 前言一、分析 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码,但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析编码有了下面成功 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/33baf91a49da410e82f16b4fbd746c48…

es自动补全(仅供自己参考)

elasticssearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询效率,对于文档中字段的类型有一些约束: 查询类型必须是:completion 字段内容是多个补全词条形成的数组 P…

了解云计算工作负载保护的重要性及必要性

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求,而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端,保护他们的云工作负载(指所有部署的应用程序和服务)变得越来越重要。云工作负载保护&…

ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染

一、组件基础 1.什么是ArkTS ArkTS是HarmoyOS优选的助力应用开发的语言,ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步的扩展,继承了TS所有的特性,是TS的超集。 扩展的能力如下: 基本语法 …

从 ES Kafka Mongodb Restful ... 取到 json 之后

json 是个好东西,它可以使用公共的文本形式承载了丰富的结构化数据的信息。现代很多技术都在喜欢使用 json 作为数据传输格式,比如 Elastic Search,Restful,Kafka 等,Mongodb 这类对性能较在意的技术则使用了二进制化的 json。 结构化的数据…

Rust-宏编程

巴山楚水凄凉地,二十三年弃置身。 怀旧空吟闻笛赋,到乡翻似烂柯人。 沉舟侧畔千帆过,病树前头万木春。 今日听君歌一曲,暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

抖音短视频矩阵源码/矩阵系统搭建/短视频矩阵系统源码开发知识分享

短视频矩阵系统架构解析 在构建短视频矩阵系统时,通常会采用三种核心的框架技术:Spring、Struts和Hibernate。每种框架都承担着不同的职责,共同支撑起系统的高效运行。 Spring框架:作为全栈式的Java开发平台,它提供了…

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

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

AJAX 全面教程:从基础到高级

AJAX 全面教程:从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX(Asynchronous JavaScript and XML…

ASP.NET Core 路由规则,自定义特性路由 ,IActionConstraint 路由约束 总结 mvc

资料 资料 路由服务 路由服务是在 Program.cs 中使用 builder.Services.AddRouting()注册的, 只是默认在 builder 之前已经注册过了,无需我们再次注册。 AddRouting()方法必须在 UseRouting()方法之前运行,它是路由的基础服务。 MapContro…

二分法查找(c基础)

二分法查找一个有序数组中是否有某个数 大家看了可以自己写一下 &#xff08; 要用知识点 数组 while循环 scanf 函数 printf函数 &#xff09; //用二分法查找 #include<stdio.h> int main() {char arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof(arr) / size…

20241106软考架构-------软考案例12答案

每日打卡题案例12答案 【2015年真题】 难度&#xff1a;一般 阅读以下关于应用系统数据架构的说明&#xff0c;回答下列问题。&#xff08;25分&#xff09; 【说明】 某软件公司拟开发一套贸易综合管理系统&#xff0c;包括客户关系管理子系统和商品信息管理子系统两部分。客…

wps的Excel中使用条件格式

本例演示怎样根据单元格的值设置单元格的格式&#xff0c;重点介绍多条件的混合使用 例&#xff1a;请将列2中值为A或A的单元格设置为绿色 多条件&#xff0c;即是与、或、非的组合&#xff0c;wps里有对应的函数可用

[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…

GIS地形图配准实验

地形图配准&#xff1a;指将地形图或其他地理数据&#xff08;如航拍图像、卫星图像等&#xff09;与地理坐标系统对齐的过程&#xff0c;使得这些图像或图形能够在地理空间中正确地定位。配准是将非地理坐标的地图或图像转换为地理坐标的一个重要步骤 分析原地形图 地图左上…

Python酷库之旅-第三方库Pandas(198)

目录 一、用法精讲 921、pandas.Index.get_level_values方法 921-1、语法 921-2、参数 921-3、功能 921-4、返回值 921-5、说明 921-6、用法 921-6-1、数据准备 921-6-2、代码示例 921-6-3、结果输出 922、pandas.Index.get_loc方法 922-1、语法 922-2、参数 92…

机器学习(四)——神经网络(神经元、感知机、BP神经网络、梯度下降、多层神经网络、Python源码)

目录 关于1 神经元模型2 感知机与多层网络3 误差逆传播算法4 全局最小与局部极小5 其他常见神经网络6 深度学习X 案例代码X.1 源码X.2 数据集&#xff08;加州房价数据&#xff09;X.3 模型效果 关于 本文是基于西瓜书&#xff08;第五章&#xff09;的学习记录。内容包括神经…

Diving into the STM32 HAL-----Clock Tree笔记

几乎每个数字电路都需要一种方法来同步其内部电路或与其他电路同步。时钟是一种产生周期性信号的设备&#xff0c;它是数字电子学中最普遍的心跳源形式。 然而&#xff0c;相同的时钟信号不能用于馈送现代微控制器&#xff08;如 STM32 微控制器&#xff09;提供的所有组件和外…

每日科技资讯:2024年11月06日【龙】农历十月初六 ---文末送书

目录 1.OpenAI因算力瓶颈暂缓GPT-5发布 合作芯片开发寻求突破2.现在&#xff0c;&#x1d54f; 允许被你屏蔽的人继续查看你的帖子3.硬刚Intel与AMD&#xff01;NVIDIA明年推出PC芯片4.苹果停止签署 iOS 18.0.1&#xff0c;不再允许从 18.1 降级5.Nvidia 加入道琼斯指数成份股 …

高效率的快捷回复软件 —— 客服宝聊天助手

在电商行业日益繁荣的今天&#xff0c;高效的客户沟通对于企业的成功至关重要。无论是电商平台、居家客服还是其他各类客服行业&#xff0c;都需要一款强大的工具来提升工作效率。今天&#xff0c;我们就来介绍一款高效率的快捷回复软件 —— 客服宝聊天助手。 一、跨平台跨店铺…