Go 数据库查询与结构体映射
下面是关于如何使用 Go 进行数据库查询并映射数据到结构体的教程,重点讲解 结构体字段导出 和 db 标签 的使用。
Go 数据库查询与结构体映射教程
在 Go 中,我们可以使用 database/sql 或 sqlx 等库与数据库进行交互。为了方便地将数据库查询结果映射到结构体中,Go 使用了结构体字段导出和**db 标签**的机制。
本教程将详细讲解如何正确使用这些机制来进行数据库查询,并避免常见的错误。
1. 为什么需要结构体字段导出?
Go 使用 反射机制 来访问结构体的字段。只有 导出字段(即首字母大写的字段)才能通过反射访问。如果字段是小写字母开头的,Go 认为它是 私有的,因此无法在数据库查询中使用。
错误示例:结构体字段未导出
type AppEntry struct {key string `db:"key"` // 错误:字段 "key" 是小写,不会被导出appTypeId int64 `db:"app_type_id"` // 正确:字段 "AppTypeId" 是大写
}
上面代码中,key 字段是小写字母开头,数据库查询无法将查询结果映射到这个字段上。
2. 导出字段与 db 标签的正确用法
为了让 Go 通过反射机制正确地将查询结果填充到结构体中,我们需要确保:
- 结构体字段是 大写字母开头(即 导出字段)。
- 使用
db标签 来指定结构体字段与数据库字段的映射关系。
正确示例:结构体字段导出并使用 db 标签
type AppEntry struct {Key string `db:"key"` // 正确:字段 "Key" 是大写,db 标签与数据库字段 "key" 匹配AppTypeId int64 `db:"app_type_id"` // 正确:字段 "AppTypeId" 是大写,db 标签与数据库字段 "app_type_id" 匹配
}
在这个例子中:
- 结构体的字段
Key和AppTypeId是大写字母开头,符合 Go 的导出字段要求。 db标签告诉 Go 数据库库,字段Key映射到数据库表的key字段,字段AppTypeId映射到数据库表的app_type_id字段。
3. 如何查询数据库并将结果映射到结构体
一旦结构体定义正确,我们就可以使用 Go 的数据库库(例如 sqlx)来执行查询,并将查询结果映射到结构体中。假设我们有一个名为 sys_app_list 的数据库表,我们将查询该表中的 key 和 app_type_id 字段,并将结果映射到结构体 AppEntry 中。
示例代码:查询数据库并映射数据
package mainimport ("database/sql""fmt""log"_ "github.com/go-sql-driver/mysql" // 引入 MySQL 驱动
)type AppEntry struct {Key string `db:"key"`AppTypeId int64 `db:"app_type_id"`
}func main() {// 连接到数据库db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/your_database")if err != nil {log.Fatal(err)}defer db.Close()// 执行查询rows, err := db.Query("SELECT `key`, app_type_id FROM sys_app_list")if err != nil {log.Fatal(err)}defer rows.Close()// 读取查询结果var appEntries []AppEntryfor rows.Next() {var entry AppEntryif err := rows.Scan(&entry.Key, &entry.AppTypeId); err != nil {log.Fatal(err)}appEntries = append(appEntries, entry)}// 检查查询是否出错if err := rows.Err(); err != nil {log.Fatal(err)}// 打印查询结果for _, entry := range appEntries {fmt.Printf("Key: %s, AppTypeId: %d\n", entry.Key, entry.AppTypeId)}
}
代码解析:
- 数据库连接:使用
sql.Open连接到 MySQL 数据库,并通过defer db.Close()确保在程序退出时关闭数据库连接。 - 执行查询:通过
db.Query执行 SQL 查询,查询sys_app_list表中的key和app_type_id字段。 - 读取结果:使用
rows.Scan将查询结果填充到结构体AppEntry的Key和AppTypeId字段中。 - 处理查询结果:将查询结果存储在
appEntries切片中,并在程序结束时打印输出。
4. 常见错误及排查
在使用数据库查询时,常见的错误包括:
- 字段未导出:如前所述,Go 无法访问小写字母开头的字段,必须确保字段是大写字母开头。
db标签错误:确保数据库字段名与结构体字段名通过db标签正确匹配。如果数据库字段名和结构体字段名不一致,必须显式指定标签。
错误示例:字段未导出或标签错误
type AppEntry struct {key string `db:"key"` // 错误:字段 "key" 未导出,无法填充appTypeId int64 `db:"app_type_id"` // 错误:字段 "appTypeId" 是小写
}
正确示例:字段导出并使用 db 标签
type AppEntry struct {Key string `db:"key"` // 正确:字段 "Key" 是导出字段AppTypeId int64 `db:"app_type_id"` // 正确:字段 "AppTypeId" 是导出字段
}
5. 总结
- 结构体字段必须是导出的(即首字母大写),否则数据库库无法访问该字段。
- 使用
db标签 映射结构体字段与数据库字段名之间的关系。 - 查询数据库并映射结果 使用 Go 的数据库库(如
sql或sqlx),确保正确处理查询结果。
通过遵循这些规则,我们可以有效地查询数据库并将结果映射到 Go 结构体中,从而实现数据的操作和处理。
这篇教程应该可以帮助你理解如何正确地使用 Go 进行数据库查询和结构体映射。
相关文章:
Go 数据库查询与结构体映射
下面是关于如何使用 Go 进行数据库查询并映射数据到结构体的教程,重点讲解 结构体字段导出 和 db 标签 的使用。 Go 数据库查询与结构体映射教程 在 Go 中,我们可以使用 database/sql 或 sqlx 等库与数据库进行交互。为了方便地将数据库查询结果映射到结…...
Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】
1个视频说清楚WIFI:频段/历程/技术参数/常用模块 智能手机拥有率越来越高的今天,大家已经习惯了通过无线网络上网的方式。除了在外面需要用手机流量,我们通常在家里或者机场,商场都可以通过Wi-Fi连接上网。本期文章将为大家介绍Wi…...
2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享
一、背景特殊医学用途配方食品简称特医食品,是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要,专门加工配置而成的配方食品,包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…...
STM32学习笔记------编程驱动蜂鸣器实现音乐播放
1. 硬件准备 STM32开发板:STM32F407系列蜂鸣器:常见的蜂鸣器分为两类:有源蜂鸣器和无源蜂鸣器。若使用有源蜂鸣器,只需提供电源和控制信号即可;若使用无源蜂鸣器,则需要控制频率。外接电源(可选…...
ubuntu18.04 安装与卸载NCCL conda环境安装PaddlePaddle
cuda版本11.2 说明PaddlePaddle需要安装NCCL 1、Log in | NVIDIA Developer 登录官网 找到对应版本 官方提供了多种安装方式,本文使用Local installers (x86)本地安装 点击对应的版本下载如: nccl-local-repo-ubuntu1804-2.8.4-cuda11.2_1.0-1_amd6…...
AI有鼻子了,还能远程传输气味,图像生成香水
众所周知,图像、音乐能用AI生成,但出乎意料的是,气味也行。最近,一个名叫Osmo的初创公司宣布,他们成功地将气味数字化了。第一个成功的案例是“新鲜的夏季李子”,而且复现出的味道“闻起来”很不错。整个过…...
学习配置dify过程记录
最近在学习安装 Dify 并集成 Ollama 和 Xinference,学习过程中遇到很多问题,所以我都记录下来。 本人电脑环境:MacBook Pro 15.1系统 基本是基于B站教程一步步搭建: 【Dify快速入门 | 本地部署Dify基于Llama 3.1和OpenAI创建聊天机器人与知…...
简易抽奖器源码以及打包操作
import wx import random import time# 定义Myframe类,继承Frame class Myframe(wx.Frame):# 奖品rewards [桥本香奈, 二代CC, NaNa, 情深叉]# 构造方法def __init__(self):# 父类初始化super().__init__(None, title主界面, size(500, 400), pos(500, 200))# 创建面板&#x…...
一文了解什么是腾讯云开发
一文了解什么是腾讯云开发 关于云开发的猜想腾讯云开发腾讯云开发的优势无服务跨平台轻松托管节约成本 快速上手云开发环境快速搭建管理后台 云开发体验 关于云开发的猜想 说到云开发,作为开发者的大家是否大概就有了想法。比如说过去的开发工作都是在自己本地电脑…...
[CKS] K8S NetworkPolicy Set Up
最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于不安全项目修复的题目。 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Ne…...
【JAVA】Java基础—面向对象编程:构造方法-实现一个Car类,包含多个构造方法,创建不同的汽车对象
在Java中,构造方法则是用于创建对象的特殊方法。通过构造方法,可以在创建对象时初始化其属性。构造方法的重载允许我们根据不同的需求定义多个构造方法,从而灵活地创建对象。 我们可以将汽车的构造方法比作汽车的配置选项。比如,…...
初识网络编程TCP/IP
目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程,会出现一堆协议、概念、这层次那技术的,头都大了,还是得总结总结…… 相关名词解释 ✨✨网络…...
快速入门Zookeeper
Zookeeper ZooKeeper作为一个强大的开源分布式协调服务,扮演着分布式系统中至关重要的角色。它提供了一个中心化的服务,用于维护配置信息、命名、提供分布式同步以及提供组服务等。通过其高性能和可靠的特性,ZooKeeper能够确保在复杂的分布式…...
Filter and Search 筛选和搜索
Goto Data Grid 数据网格 Filter and Search 筛选和搜索 Filter Drop-down Menus (Excel-style) 筛选器下拉菜单(Excel 样式) 要调用列的筛选器下拉菜单,请单击列标题中的筛选器图标。在 “Values” 选项卡中,用户可以从 Data …...
spark的学习-06
SparkSQL读写数据的方式 1)输入Source 方式一:给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二:…...
Linux C/C++ Socket 编程
本文目录 Linux C语言 socket 编程 client 端头文件 unistd.h & arpa/inet.h1. **unistd.h**2. **arpa/inet.h** socket() 创建套接字sockaddr_in 结构体inet_pton()connect()send()recv()send() 和 recv() 中的 flags 参数**默认行为(flags 0)的特…...
Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared
前言 今天要做蓝牙通信的功能,我使用了flutter_reactive_ble这个库,但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…...
Spark 的容错机制:保障数据处理的稳定性与高效性
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...
TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍
TCP连接的建立(三次握手) 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文(SYN 和 SYN-ACK),用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…...
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本: 安装 使用方法 使用文件 URL: 使用本地路径&…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
