Gorm操作Oracle数据库

Go使用Gorm连接Oracle 在go开发中,没有官方的oracle驱动支持,这使得在使用gorm操作oracle特别复杂,但是又不得不用Oracle数据库。这是社区开发并维护的开源项目,它为 Go 语言提供了一个强大的 Oracle 数据库驱动程序。是纯go实现的,不在需要Oracle client 或者cgo支持。在github中看到gorm的oracle支持是godror这个项目,但是这个项目需要cgo的支持,在需要跨平台编译的项目中体验很不好。方法来获取dsn,它会自动完成特殊字符的转义,减少开发中出错的可能。 阅读详情

前置条件
首先安装oci8和oracle数据库客户端,之后配置好环境变量LD_LIBRARY_PATH

获取Gorm-Oracle驱动

go get github.com/CengSin/oracle

在文件加载的时候初始化数据库连接

package main

import (
	"GoModuleDemo/oracle/oci8/model"
	"encoding/json"
	"fmt"
	"github.com/cengsin/oracle"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/logger"
	"log"
	"math/rand"
	"os"
	"strconv"
	"time"
)

var (
	db *gorm.DB
)

func init() {
	log.Println("initial database connect……")
	con, err := gorm.Open(oracle.Open("system/oracle@127.0.0.1:1521/XE"), &gorm.Config{
		Logger: logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
			SlowThreshold: 1 * time.Millisecond,
			LogLevel:      logger.Warn,
			Colorful:      true,
		}),
		//SkipDefaultTransaction: true,
	})

	if err != nil {
		log.Fatalln(err)
	}

	// 初始化各种结构
	db = con
	if err = db.AutoMigrate(
		&model.ClassInfo{},
		&model.UserInfo{},
		&model.Email{},
		&model.UserModel{},
		&model.CreditCard{},
		&model.Product{},
		&model.Company{},
	); err != nil {
		log.Fatalln(err.Error())
	}
}

定义结构模型

package model

import (
	"fmt"
	"gorm.io/gorm"
	"time"
)

type ClassInfo struct {
	ClassId   int64  `gorm:"column:CLASSID;primaryKey"`
	ClassName string `gorm:"column:CLASSNAME;size:50"`
}

type UserInfo struct {
	Id       int64     `gorm:"column:ID;primaryKey"`
	Name     string    `gorm:"column:USER_NAME;not null"`
	Age      int64     `gorm:"column:USER_AGE"`
	Sex      string    `gorm:"column:USER_SEX"`
	Total    int64     `gorm:"-"`
	EmailId  string    `gorm:"column:EMAIL_ID"`
	Birthday time.Time `gorm:"column:BIRTHDAY"`
}

type Email struct {
	Id        int64          `gorm:"column:ID;primaryKey;AUTOINCREMENT"`
	EmailStr  string         `gorm:"column:EMAIL;NOT NULL"`
	DeletedAt gorm.DeletedAt `gorm:"column:DELETED_AT;index"`
}

func (e *Email) TableName() string {
	return "EMAILS"
}

type CreditCard struct {
	ID          uint       `gorm:"column:ID;AUTOINCREMENT;primaryKey"`
	CreatedAt   time.Time  `gorm:"column:CREATED_AT"`
	UpdatedAt   time.Time  `gorm:"column:UPDATED_AT"`
	DeletedAt   *time.Time `gorm:"column:DELETED_AT;index"`
	CNumber     string     `gorm:"column:CNUMBER"`
	Description string     `gorm:"column:DESCRIPTION"`
	UserModelID uint       `gorm:"column:USERMODELID"`
	InsertID    int64      `gorm:"column:INSERT_ID;default:0"`
}

func (c *CreditCard) TableName() string {
	return "CREDITCARD"
}

type UserModel struct {
	ID          uint   `gorm:"column:ID;AUTOINCREMENT;primaryKey"`
	Name        string `gorm:"column:NAME"`
	CreditCard  CreditCard
	Age         int64  `gorm:"column:AGE"`
	Active      bool   `gorm:"column:ACTIVE;type:bool"`
	CompanyId   int64  `gorm:"column:COMPANY_ID"`
	CompanyName string `gorm:"column:COMPANY_NAME"`
}

func (u *UserModel) TableName() string {
	return "USERMODEL"
}

func (e *Email) BeforeCreate(g *gorm.DB) error {
	fmt.Println("BeforeCreateData---")
	e.EmailStr += "_run_before_create"
	return nil
}

func (u UserInfo) TableName() string {
	return "USERINFO"
}

func (c ClassInfo) TableName() string {
	return `CLASSINFO`
}

type Product struct {
	ID       int64  `gorm:"column:ID;primaryKey;AutoIncrement"`
	Name     string `gorm:"column:NAME;size:50"`
	Price    int64  `gorm:"column:PRICE;size:3"`
	Quantity int64  `gorm:"column:QUANTITY;size:3"`
}

func (p *Product) TableName() string {
	return "PRODUCT"
}

type Company struct {
	Id   int64  `gorm:"column:ID;primaryKey;AUTOINCREMENT"`
	Name string `gorm:"column:NAME"`
}

func (c *Company) TableName() string {
	return "COMPANIES"
}

对数据库进行操作

func QueryCaseTest() {
	classInfo := new(model.ClassInfo)
	// 获取第一条记录(主键升序)
	db.First(classInfo)
	fmt.Printf("获取第一条记录(主键升序)%+v\n", classInfo)
	// SELECT * FROM users ORDER BY id LIMIT 1;

	// 获取第一条记录(主键升序)
	classInfo = new(model.ClassInfo)
	db.Take(classInfo)
	fmt.Printf("获取第一条记录(主键升序)%+v\n", classInfo)
	// SELECT * FROM users LIMIT 1;
}

func CreateEmail(splitStr string) model.Email {
	rand.Seed(time.Now().UnixNano())

	fmt.Println(splitStr + "Email Create Row" + splitStr)
	email := model.Email{EmailStr: strconv.Itoa(rand.Int()) + "@163.com"}
	emailResult := db.Create(&email)
	fmt.Println("插入新数据之后的ID为:", email.Id)                // 返回插入数据的主键
	fmt.Println("返回的Error为:", emailResult.Error)         // 返回 error
	fmt.Println("返回插入记录的条数为:", emailResult.RowsAffected) // 返回插入记录的条数
	return email
}


func UpdateMultiplyColumn(splitStr string, user *model.UserModel) {
	// 根据 `struct` 更新属性,只会更新非零值的字段
	db.Model(&user).Updates(model.UserModel{Name: "hello", Age: 18, Active: false})
	// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

	// 根据 `map` 更新属性
	db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
	// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
}

func UpdateSingleColumn(spli string, user *model.UserModel) {
	fmt.Println(spli + "更新指定的列" + spli)
	if err := db.Model(&model.UserModel{}).Where("ID = ?", user.ID).Update("NAME", "jinzhu 4").Error; err != nil {
		log.Fatalln(err)
	}
}

调用修改方法

func main() {
	var splitStr = "----------------"
	// 调用方法即可
	// ……
}
GORM入门到精通:构建高效Go应用的终极指南 在数据库的生命周期中,我们经常需要对数据库结构进行调整,比如添加新的列、修改现有列或者删除某些表。GORM提供了强大的迁移功能,允许开发者以版本控制的方式管理数据库结构的变更。GORM允许你通过模型定义来指定表名、列名、索引等数据库结构。这使得你可以在不接触SQL的情况下,定义数据库的结构。gorm.Modelnot null"` // 指定列名和大小unique\_index"` // 指定列类型和唯一索引not null"` // 指定列类型// 自定义表名在这个例子中,我们为User。 阅读详情

相关推荐

golang gorm 操作mysql及gorm基本用法

golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍,感兴趣的朋友跟随小编一起看看吧

GORM 连接 ORACLE

1.安装依赖 go get github.com/cengsin/oracle 有可能会出现如下错误: # github.com/godror/godror cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH% 解决措施:安装 gcc 环境 打开网址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 下载M.

tplina的博客 3203

腾讯Octop:Windows本地AI助手一键安装实战指南

本地AI助手是面向普通用户在个人设备上运行大语言模型的轻量级解决方案,其核心原理在于封装模型加载、推理调度与Web交互等底层复杂性,通过预编译运行时、自适应硬件加速和图形化配置降低使用门槛。技术价值体现在免环境依赖、离线可用、开箱即用,显著提升非开发者在专利撰写、文案生成、技术文档处理等办公场景中的生产力。本文聚焦Windows平台下的腾讯Octop工具,结合qwen2-7b-instruct、phi-3-mini等主流GGUF量化模型,详解安装适配、API集成与专利辅助工作流,覆盖从零部署到工程落地的完整

weixin_29055137的博客 304

go连接Oracle数据库

使用go连接Oracle数据库(gorm)

m0_58183482的博客 2573

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程

本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。

weixin_29168393的博客 304

吹气压力传感器US6310 US6330调试

更换压力传感器, 从US6310 更换为US6330。 6310有一个准备好引脚,AD转换完成后会给MCU一个脉冲 而6330就没有这个功能,6330这个引脚是用来选择SPI还是I2C接口的。(6330没有复位引脚,内部有POR功能) 因此在实现上是有根本区别的, 其它方面使用的命令也不一样, 6310 A8 A9两条命令,一个命令模块醒来,一个命令模块休眠, 6330只有一条命令AA, 命令模块开始转换。 针对这2个模块作为2种处理方法, 1. 6310,可以设置一...

明天乌儿会歌唱 2023

Go 连接 Oracle 太麻烦?一文教你优雅搞定 GORM + Oracle 全流程!

如何使用 Go 和 GORM 连接 Oracle 数据库;如何配置 DSN、安装驱动、处理连接池;如何封装连接逻辑用于生产项目。无论是新项目对接 Oracle,还是旧系统重构迁移到 Go,掌握这项技能都能让你如鱼得水!

tenkofx的博客 1364

ZEMAX知识点:坐标间断面(coordinate break)

zemax知识点:坐标间断面

weixin_47638568的博客 1万+

问题解决:gorm查询oracle库表,返回struct字段数据为空的问题

【代码】问题解决:gorm查询oracle库表,返回struct字段数据为空的问题。

tower888的专栏 758

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

实际上,这个问题原因还是由于投影转换的问题,在set_extend时,绘制的上下边界仍然是方形、未被正确投影的边界,与我们的set_boundary存在冲突,最根本的原因还是在于cartopy对于投影计算的一些缺陷。另外我们需要指出的是:**该方法不适用于极地投影,即NorthPolarStereo,由于NorthPolarStereo本身投影特性只需一个参数,本身并不适合。我们绘制极地投影时,同样也是使用set_boundary绘制圆形边界,那么当我们想要绘制扇形时,可以通过。请根据喜好自行选择,

weixin_43750300的博客 3212

基于MUSIC算法的DOA估计Matlab仿真

特别需要指出的是:通道与阵元并不是一一对应,通道是由空间的一个、几个或所有阵元合成的,当然空间某个特定的阵元可包含在不同的通道内。空间谱估计侧重于研究空间多传感器阵列所构成的处理系统对感兴趣的空间信号的多种参数进行准确估计的能力,其主要目的是估计信号的空域参数或信源位置,这也是雷达、通信、声纳等许多领域的重要任务之一。从系统框图中可以清晰的看出,估计空间相当于是对目标空间的一个重构过程,这个重构的精度由众多因素决定,如环境的复杂性、空间阵元的互耦、通道不一致、频带不一致等。

FPGA/MATLAB学习教程/源码/项目合作开发 1747

使用Gorm操作Oracle数据库踩坑

gorm连接oracle提示github.com/cengsin/oracle@v1.0.0/oracle.go:53:59: unknown field 'WithReturning' in struct literal of type callbacks.Config错误

Monkey_D_Newdun的博客 2641

ROS从入门到精通0-4:VSCode 搭建 ROS 工程环境

为了提高开发效率,可以先安装集成开发工具和使用方便的工具,本教程用VSCode搭建ROS工程环境

FRIGIDWINTER的博客 1万+

oracle 中文语言集_震惊!Gorm 终于可以操作 Oracle 了

点击上方蓝色“Go语言中文网”关注,每天一起学 Go前言:写这篇文章的目的有两个,一是希望找到志同道合的伙伴一起维护这个库,提高这个库的代码质量。二是为了推广 gorm 的 oracle 驱动,避免因为操作 oracle 而编写大量的样板代码。同时也要感谢Go 语言中文网的站长 polaris 能用它的公众号为这个库进行推广。gorm-oracle 开源库地址:https://githu...

weixin_39683176的博客 1433

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

go使用gorm访问数据库

package main import ( "fmt" "log" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //DriverType 数据库驱动 type DriverType int const ( mysql DriverType = iota //0 mssql //1 oracle .

wweixiao的博客 1154

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一篇文章解决GORM CRUD

一篇文章彻底解决GORM 所有常见的 CRUD!

MCM0115的博客 969

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

GORM Oracle驱动手册

GORM Oracle驱动手册 项目介绍 GORM Oracle驱动 是一个用于连接Oracle数据库并进行管理的GORM适配器。该项目基于stevefan1999-personal/gorm-driver-oracle开发,但请注意,开发者并不推荐在生产环境中使用此驱动。若要实现与Oracle数据库的高效对接,您需确保已安装Oracle 12C及以上版本,并且您的开发环境支持Go语言1.13以上...

gitblog_00988的博客 618

GORM新手入门心得

GORM是Go语言中一个简化数据库操作的ORM库,提供便捷的数据库操作方式。安装方式为go get -u gorm.io/gorm和对应的数据库驱动。GORM默认将结构体名转为小写复数作为表名,字段名转为snake_case,并自动处理ID主键和CreatedAt/UpdatedAt时间戳。支持结构体嵌套,可通过embedded标签实现字段嵌入。连接数据库需要配置DSN字符串。插入数据示例展示了通用API的使用方法,支持泛型类型指定、错误处理和结果返回。该库简化了Go语言中的数据库操作流程。

ZhengDushi的博客 544

Golang并发读取json文件数据并写入oracle数据库的项目实践

还是假设数据库中有一个SHOPS表,结构体方法TableName指定该类型对应的数据表,编写如下model.go文件​packagemodeltypeShopInfostructShopIdstringnot null"`ShopNamestringnot null"`// 省略剩余的字段funcsShopInfoTableName()stringreturn"SHOPS"

Cherry 1020

oracle官方驱动 go,Windows + Golang + Oracle 11g + GORM(改) + go-oci8 的数据库驱动测试(超详细)...

一、系统环境介绍:Windows 10Oracle 11g 64bitOCI -> instantclient-basic-windows.x64-12.2.0.1.0OCI SDK -> instantclient-sdk-windows.x64-12.1.0.2.0MinGW 64bitgo1.11 windows/amd64注意:我在Oracle 11g版本下使用 OCI 及 S...

weixin_36074841的博客 1086

gorm 基本使用 2

go复制代码对应的sql语句sql复制代码go复制代码。

BASK2312的博客 1071

使用 Go-Ora 连接到 Oracle 数据库

GODROR 是一个活跃的 Oracle 驱动,基于官方的 ODPI-C (Oracle Call Interface (OCI) wrapper) 接口。go-ora 是由 Go 语言实现的 Oracle 客户端,推荐使用 go-ora v2 版本,对 Oracle 10.2 及以上版本更友好。需要注意的是,为了安全起见,不要在代码中硬编码数据库连接信息,这里只是为了演示,建议在正式环境中使用环境变量或配置文件来管理敏感信息。本文将介绍如何使用 Go 语言构建项目,并连接到 Oracle 数据库。

少安事务所 2502

Golang并发读取文件数据并写入数据库

记录一下用Golang做并发,创建多个goroutine去读取指定目录下的多个JSON格式的数据文件,并将其每条数据格式化后写入到Oracle数据库

Monkey_D_Newdun的博客 5425

viper映射结构

viper.SetConfigName("Type") // 不带扩展名的文件名。viper.AddConfigPath(".") // 配置文件所在路径。// SingularTable: false, //是否单数表名。// NoLowerCase: false, //不要小写。// TablePrefix: "TB_", //表前缀。viper.SetConfigType("yaml") // 文件类型。// 初始化 Viper。

weixin_45917702的博客 469

gorm Expr使用小技巧

(如按指定ID顺序):go复制。

leijmdas的专栏 824
上一篇: Linux服务器安装ArangoDB数据库:
MerGoing
博客等级 码龄11年 8粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值