热门标签 | 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语句执行,这可能是最傻的一种方法了,不过却能保证事情完全按照自己的想法执行。

推荐阅读
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • Logistic回归主要针对输入的数据是多个,输出则是有限的数值型,多为2个分类。涉及到以下方面:1.输出yw0+w1*x1+w2*x2+..(x1,x2,是样本的 ... [详细]
  • 千万不要错过的后端[纯干货]面试知识点整理 I I
    千万不要错过的后端【纯干货】面试知识点整理IIc++内存管理上次分享整理的面试知识点I,今天我们来继续分享面试知识点整理IIlinuxkernel内核空间、内存管理、进程管理设备、 ... [详细]
  • 使用gin改写“SectionBuildingRESTfulAPIs”第三方包需要提前准备的包有:“gopkg.ingin-gonicgin.v1”“gopkg.inmgo.v2” ... [详细]
  • 在实际开发中,现在安卓端和后台之间的数据交互,一般都是用JSON来传递数据信息。JSON大家一般都比较熟悉。我这边就以实际项目中的后台传过来的情况和大家分析下及如何处理。比如后台返 ... [详细]
  • Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态 ... [详细]
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • 最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。 ... [详细]
  • delphi控件大全
    本文章已收录于:delphi控件查询:http:www.torry.nethttp:www.jrsoftware.orgTb97最有名的工具条(ToolBar) ... [详细]
  • 简单动态字符串redis里面很多地方都用到了字符串,我们知道redis是一个键值对存储的非关系型数据库,那么所有的key都是用字符串存储的,还有字符串类型,这些都是用字符串存储的 ... [详细]
  • Ithinkthishasbeenupbefore,butcouldntfindanyanswertoit.Ifitsalreadyansweredplease ... [详细]
  • 问题描述  编写一个程序,输入一个1000以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示。  输入格式:输 ... [详细]
  • 数据结构之图的深度优先搜索,Go语言社区,Golang程序员人脉社 ... [详细]
  • LwIP系列内存管理(堆内存)详解
    一、目的小型嵌入式系统中的内存资源(SRAM)一般都比较有限,LwIP的运行平台一般都是资源受限的MCU。为了能够更加高效的运行ÿ ... [详细]
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社区 版权所有