使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄
gorm是目前用得最多的go語言orm庫,但是目前gorm官方并不支持oracle的驅(qū)動(dòng),需要用到第三驅(qū)動(dòng),最近有個(gè)項(xiàng)目要往oracle寫數(shù)據(jù),記錄一下踩到的坑
下載依賴
go get github.com/cengsin/oracle
這個(gè)驅(qū)動(dòng)與最新的gorm庫不匹配,要將gorm降級(jí)到1.21版本,不然會(huì)出現(xiàn)“......github.com/cengsin/oracle@v1.0.0/oracle.go:53:59: unknown field 'WithReturning' in struct literal of type callbacks.Config” 錯(cuò)誤
項(xiàng)目結(jié)構(gòu)
包含main.go和一個(gè)model目錄。
|——oracle_test | |——model | |——model.go | |——main.go | |——go.mod
編輯go.mod將gorm降級(jí)
module oracle_test
go 1.16
require (
github.com/cengsin/oracle v1.0.0
gorm.io/gorm v1.21.16
)
運(yùn)行g(shù)o mod tidy命令生效
定義model類型
假設(shè)數(shù)據(jù)庫里有張商店信息的表shops,包含ID和店名兩個(gè)字段,編寫如下model.go文件。其中結(jié)構(gòu)體方法TableName指定改類型對(duì)應(yīng)的數(shù)據(jù)表。
package model
type ShopInfo struct {
ShopId string `gorm:"column:SHOPID;not null"`
ShopName string `gorm:"column:SHOPNAME;not null"`
}
func (s *ShopInfo) TableName() string {
return "shops"
}
連接數(shù)據(jù)庫
連接名"database/password@127.0.0.1:1521/XE"中database是數(shù)據(jù)庫名,password是密碼,XE是服務(wù)名。LogLevel為logger.Warn會(huì)打印大多數(shù)sql語句,設(shè)為logger.Error只會(huì)打印運(yùn)行出錯(cuò)的sql語句。
package main
import (
"fmt"
"log"
"os"
"time"
"oracle_test/model"
"github.com/cengsin/oracle"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
func test() {
log.Println("initial database connect……")
db, err := gorm.Open(oracle.Open("database/password@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, //打印級(jí)別
Colorful: true,
}),
//SkipDefaultTransaction: true,
})
if err != nil {
log.Fatalln(err)
}
if e := db.AutoMigrate(&model.ShopInfo{}); e != nil {
log.Fatalln(e.Error())
}
shopInfo := new(model.ShopInfo)
db.First(shopInfo)
fmt.Print(*shopInfo)
}
測(cè)試運(yùn)行
go run ./main.go
到此這篇關(guān)于使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄的文章就介紹到這了,更多相關(guān)Gorm操作Oracle內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
初探Golang數(shù)據(jù)結(jié)構(gòu)之Slice的使用
在學(xué)習(xí)Go語言時(shí),一直對(duì)數(shù)組和切片的使用場(chǎng)景好奇,不明白為什么推薦使用切片來代替數(shù)組,所以本文就來和大家梳理一下Slice切片的相關(guān)知識(shí)吧2023-09-09
golang 獲取當(dāng)前執(zhí)行程序路徑的操作
這篇文章主要介紹了golang 獲取當(dāng)前程序執(zhí)行路徑的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Go語言實(shí)現(xiàn)定時(shí)器的原理及使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)定時(shí)器的兩種方法:一次性定時(shí)器(Timer)和周期性定時(shí)器(Ticker),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆
堆是一種非常常用的數(shù)據(jù)結(jié)構(gòu),它能夠支持在O(1)的時(shí)間復(fù)雜度獲取到最大值(或最小值)。本文主要介紹了如何實(shí)現(xiàn)支持O(log(n))隨機(jī)刪除元素的堆,需要的可以參考一下2022-09-09
go string to int 字符串與整數(shù)型的互換方式
這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

