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: 使用本地路径&…...
开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案
前置条件 假设主从信息 mysqlhostport主192.168.1.13306从192.168.1.23306vip192.168.1.3 部署流程 导出测试环境表结构与数据 使用mysqldump ./mysqldump -ulzzc -p -S /tmp/mysql3306.sock --single-transaction --database lzzc > databaseLZZCxxxx.sql查看gtid号 …...
Java全栈体系路线
Java全栈体系路线 摘要 Java 是一门广泛应用于企业级开发的语言,具有强大的生态系统和丰富的工具支持。成为一名 Java 全栈开发工程师不仅需要掌握后端开发技能,还需要具备前端开发和数据库管理的能力。本文将详细介绍 Java 全栈开发的学习路线&#x…...
【Unity基础】Unity中如何导入字体?
在Unity中,不能像其他软件一样直接使用字体文件,需要通过FontAssetCreator将其转换成Texture的Asset文件,然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程,并对其参数设置进行了说明。 Font Asset Creator 是 Uni…...
使用NVIDIA GPU加速FFmpeg视频压制:完全指南
引言 在视频处理领域,FFmpeg是一个强大的工具。结合NVIDIA的硬件编码器NVENC,我们可以实现快速高效的视频压制。本文将详细解析一个实用的视频压制命令,帮助你理解每个参数的作用。 核心命令 ffmpeg -i input.mp4 -vf scale640:360 -c:v h…...
Python学习:scipy是什么?
文章目录 一、Scipy简介二、Scipy的组成部分1. 基础功能:2. 特殊函数:3. 优化:4. 积分:5. 插值:6. 信号处理:7. 图像处理:8. 统计分布:9. 空间数据结构和算法:10. 稀疏矩…...
spark的学习-05
SparkSql 结构化数据与非结构化数据 结构化数据就类似于excel表中的数据(统计的都是结构化的数据)一般都使用sparkSql处理结构化的数据 结构化的文件:JSON、CSV【以逗号分隔】、TSV【以制表符分隔】、parquet、orc 结构化的表:…...
SQL注入(SQL Injection)详解
SQL注入(SQL Injection)是一种代码注入技术,它通过在应用程序的输入字段中插入或“注入”恶意的SQL语句,从而操控后端数据库服务器执行非预期的命令。这种攻击方式常用于绕过应用程序的安全措施,未经授权地访问、修改或…...
深入解析 OpenHarmony 构建系统-2-目录结构与核心组件
引言 OpenHarmony作为一款面向全场景的分布式操作系统,其构建系统在开发过程中扮演着至关重要的角色。本文将详细介绍OpenHarmony构建系统的目录结构和核心组件,帮助开发者更好地理解和使用这一强大的工具。 目录结构概览 以下是OpenHarmony构建系统的目录结构,每个目录和…...
网络安全应急响应(归纳)
目录 一、概述二、理论 系统排查 系统基本信息 windowsLinux用户信息 WindowsLinux启动项:开机系统在前台或者后台运行的程序,是病毒等实现持久化驻留的常用方法。 WindowsLinux任务计划:由于很多计算机都会自动加载“任务计划”,…...
【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)
绪论 “It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–,本章我将带你了解网络层,以及网络层中非常重要的IP协议格式和网络层的分片组装问题,后面将持续更新网…...
建设网站网站多少钱/百度人工服务24小时热线电话
iPhone 7和8没有物理主页按钮。 取而代之的是,按下按钮的感觉是由Apple所谓的Taptic Engine重新创建的。 当您按下主屏幕按钮时,Taptic Engine发出很小的振动。 感觉真的像按一个实际的按钮。相关:为什么我的iPhone 7上的“主页”按钮感觉奇怪…...
网站维护服务合同/谷歌三件套一键安装
从字符串载入模板我们可以定义模板字符串,然后载入并解析渲染:template.New(tplName string).Parse(tpl string)// 从字符串模板构建tplStr : {{ .Name }} {{ .Age }}// if parse failed Must will render a panic errortpl : template.Must(template.Ne…...
wordpress远程附件代码/企业推广是做什么的
2019独角兽企业重金招聘Python工程师标准>>> 今天在执行一个其他项目的数据库初始化sql脚本时,报了个这样的错: Cannot load from mysql.proc. The table is probably corrupted 看了下报错行数,是一个CREATE FUNCTION语句&#x…...
进口跨境电商网站制作/电商培训大概多少学费
问题描述: 由于jupyter出现难以解决的问题,采用重新安装来解决问题,但是重装之后启动jupyter报错ImportError: libsodium.so.23: cannot open shared object file: No such file or directory 过程描述: 运用conda命令卸载jupyter…...
珠海百度seo公司/织梦seo排名优化教程
环广西公路自行车世界巡回赛是经国际自行车联合会授权的世界顶级赛事,也是中国唯一的公路自行车世界巡回赛。此前,北海已经成功举办了两届环广西公路自行车世界巡回赛北海赛段比赛,今年是世巡赛环广西的第三年。自2017年环广西公路自行车世界…...
360 的网站链接怎么做/友情链接大全
原创不易,转载请注明出处 文章目录前言ServerSocketChannel注册源码分析总结前言 在上面之前的文章中我们剖析了ServerSocketChannel#open 与Selector#open的底层原理。本文接着之前的深度解析Java NIO底层实现原理系列文章往下介绍,看看serverSocketCh…...