热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用golang在与数据库访问过程中的一点想法

遇到的问题golang对于基本类型初始化的处理,是自动给基本类型赋值为默认值。比如:variint在这里如果不对i做任何赋值,那么i的值为零这个特性在很多地方能够避免访问到未初始化
遇到的问题

golang对于基本类型初始化的处理,是自动给基本类型赋值为默认值。比如:

var i int//在这里如果不对i做任何赋值,那么i的值为零

这个特性在很多地方能够避免访问到未初始化变量的尴尬,但是由此也引出了另外一个问题,就是在进行数据库访问操作时应该如果对待这样的默认值。

现在我们假设一个场景,表A有3个字段{AID int,AField1 string,AField2 string},表B也有3个字段{ID int,BField1 string,REF_AID int},其中表B中的REF_AID是外键对应表A中的AID。对应在GO中的数据结构应该为:

type A struct{
AID int//主键
AField1 string
AField2 string
}
type B struct{
BID int//主键
BField1 string
REF_AID int//外键,对应AID
}

在new对象B的时候,B中的三个值就分别被默认的初始化为{0,””,0},如果此时不对内容做任何操作,直接执行插入,问题就可能会变得很严重,因为A中很可能并没有任何一条记录的ID值为0,数据库报错,这条插入是一定会失败。但是仅仅在数据库层面上来看,数据库的结构是没问题的,表B中的REF_AID可以为空,在其他的语言中,如果没有对具体数据进行初始化,该属性会为空,对应插入的时候也会为空,但是在golang中,由于语言级别的默认初始化,使得这个插入过程会有大量的0的存在,触犯到原本表的约束规则而导致插入失败。

在orm中也没有看到能够解决这个问题的办法,可能是我用的不够仔细,这个留待以后再说。

自己的一点想法
  1. 把所有的数据库中相关的表都添加一条默认的以0为id的记录,该记录不需要有意义,只是用来防止歧义以及违反约束引起的操作失败,特别是一些ref_表,因为其中数据变动不大,却经常与其他一些表存在外键关系。这样做会给数据库带来一些额外的开销,但是作为一个临时的解决办法似乎还不错,至少能让数据处理流程正确的运行。
  2. 从orm中解决问题。这个只是一个想法,不过这很可能变成一种无理的要求,因为这需要orm去判断你的Field中存放的这个0到底是你自己就想指定的0值,还是你不想要却被语言默认初始化出来的0。
  3. 自己写SQL语句执行,这可能是最傻的一种方法了,不过却能保证事情完全按照自己的想法执行。

推荐阅读
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • 集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义 ... [详细]
  • Logistic回归主要针对输入的数据是多个,输出则是有限的数值型,多为2个分类。涉及到以下方面:1.输出yw0+w1*x1+w2*x2+..(x1,x2,是样本的 ... [详细]
  • 如何理解MyBatis动态SQL
    本篇内容主要讲解“如何理解MyBatis动态SQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解M ... [详细]
  • 阿里云大数据计算服务MaxCompute (原名 ODPS)
     MaxCompute是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute做了哪些工作,这些工作背后的原因是什 ... [详细]
  • 数据结构之图的深度优先搜索,Go语言社区,Golang程序员人脉社 ... [详细]
  • LwIP系列内存管理(堆内存)详解
    一、目的小型嵌入式系统中的内存资源(SRAM)一般都比较有限,LwIP的运行平台一般都是资源受限的MCU。为了能够更加高效的运行ÿ ... [详细]
  • 服务器性能优化之网络性能优化
    hi,大家好,今天分享一篇后台服务器性能优 ... [详细]
  • Linux数据链路层的包解析仅以此文作为学习笔记,初学者,如有错误欢迎批评指正,但求轻喷。一般而言,Linux系统截获数据包后,会通过协议栈,按照TCPIP层次进行解析,那我们如何 ... [详细]
  • 【Linux系统编程:基础IO 下】dup2 实现输出重定向、输入重定向、追加重定向 | 理解磁盘 | 理解文件系统中inode的概念 | 软硬链接
    写在前面这里先接着《基础IO上》中的缓冲区的内容作些补充,这里主要补充dup2接口。✔测试用例一:#include#inclu ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • funcReadXlsx(c[]CmdbTest,SheetNamestring)error{打开文件,如果文件不存在创建,存在就打开path:.cm ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
author-avatar
已1注2销
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有