Gorm操作Oracle数据库

本文介绍了如何在Go中使用Gorm ORM操作Oracle数据库,包括安装oci8和Oracle客户端,配置环境变量,加载Gorm-Oracle驱动,初始化数据库连接,定义数据结构,以及执行增删改查操作。

前置条件
首先安装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 = "----------------"
	// 调用方法即可
	// ……
}
### 关于 GORMOracle 数据库集成 GORM 是一个流行的 Go 语言 ORM 库,支持多种数据库驱动程序,包括 MySQL、PostgreSQL、SQLite 和其他第三方扩展。然而,默认情况下,GORM 并不直接提供对 Oracle 数据库的支持[^3]。为了实现 GORMOracle 的集成,通常需要借助社区开发的第三方包 `godror` 或类似的驱动程序。 以下是有关如何配置和使用 GORM 集成 Oracle 数据库的关键点: #### 1. 安装必要的依赖项 要使 GORM 支持 Oracle 数据库,首先需要安装 `godror` 驱动程序以及 GORM 自身。可以通过以下命令完成安装: ```bash go get github.com/godror/godror go get gorm.io/gorm go get gorm.io/driver/oracle ``` 这些依赖项提供了连接到 Oracle 数据库的能力,并允许通过 GORM 执行 CRUD 操作和其他高级功能[^3]。 #### 2. 连接字符串配置 在初始化 GORM 实例之前,需正确设置连接字符串。对于 Oracle 数据库而言,典型的 DSN(数据源名称)格式如下所示: ```go dsn := "username/password@hostname:port/service_name" ``` 其中: - **username**: Oracle 用户名。 - **password**: 对应用户的密码。 - **hostname**: 主机地址或 IP 地址。 - **port**: 默认端口通常是 1521。 - **service_name**: Oracle 数据库的服务名称。 示例代码片段展示如何创建 GORM 的实例并建立与 Oracle 数据库之间的连接: ```go package main import ( "fmt" "gorm.io/driver/oracle" "gorm.io/gorm" ) func main() { dsn := "scott/tiger@localhost:1521/xe" // 替换为您的实际DSN db, err := gorm.Open(oracle.Open(dsn), &gorm.Config{}) if err != nil { fmt.Println("Error connecting to the database:", err) return } fmt.Println("Successfully connected to Oracle!") } ``` 此部分逻辑负责打开一个新的 GORM Session,并验证是否成功建立了与目标 Oracle 数据库间的通信通道[^3]。 #### 3. 使用模型定义表结构映射 一旦完成了基本的连接操作之后,则可以按照常规的方式定义自己的业务对象作为实体类来表示对应的表格布局。下面给出了一种简单的例子说明怎样利用 struct 类型来进行这样的转换工作: ```go type User struct { ID uint `json:"id"` Name string `json:"name"` Age int `json:"age"` } // AutoMigrate will automatically create tables according to defined models. err = db.AutoMigrate(&User{}) if err != nil { log.Fatalf("failed migrate: %v", err) } ``` 这里我们假设存在一张名为 USERS 的表,其字段分别对应 ID、NAME 及 AGE 属性;当然也可以手动编写迁移脚本来满足更复杂的要求[^3]。 #### 4. 常见注意事项 当尝试将 GORMOracle 结合起来的时候可能会遇到一些特定挑战或者限制条件需要注意的地方有以下几个方面: - 时间戳处理差异:由于不同的 RDBMS 处理日期时间类型的机制有所区别,在跨平台移植过程中可能需要额外调整相关属性标签以确保兼容性良好; - LOB 列读写控制:如果涉及到 CLOB/BLOB 等大容量二进制数据单元的操作时建议查阅官方文档获取最佳实践指导方案; - 性能调优考量因素:考虑到 OLTP vs OLAP 工作负载特性上的差别,针对查询优化策略的选择也应当有所不同[^2]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值