[Go][ORM]Gorm

小黑-avatar-img
發佈於後端
更新於 發佈於 閱讀時間約 18 分鐘

Gorm是Go當中一款ORM函數褲,有以下特點:

  • 支持連結
  • 支援鉤子函數Hook
  • 支援預先載入
  • 支援交易
  • 支援複合主鍵
  • 支援SQL生成器
  • 支援資料庫自動遷移
  • 支援自訂日誌
  • 可擴充性
  • 所有功能都被測試覆蓋


安裝

go get -u github.com/jinzhu/gorm


使用

插入

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

GormUser := GormUser{
Phone: "13888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}
db.Save(&GormUser) //儲存到資料庫
db.Create(&GormUser) //儲存到資料庫
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}


刪除

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

GormUser := GormUser{
Phone: "13888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}
db.Save(&GormUser) //儲存到資料庫
db.Create(&GormUser) //儲存到資料庫

//删除用户
var GormUser = new(GormUser)
db.Where("phone = ?", "13888888888").Delete(&GormUser)
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}


查詢

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

GormUser := GormUser{
Phone: "13888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}
db.Save(&GormUser) //儲存到資料庫
db.Create(&GormUser) //儲存到資料庫

//查詢
var GormUser = new(GormUser)
db.Where("phone = ?", "18888888888").Find(&GormUser)
db.First(&GormUser, "phone = ?", "18888888888")
fmt.Println(GormUser)
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}


更新

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

GormUser := GormUser{
Phone: "13888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}
db.Save(&GormUser) //儲存到資料庫
db.Create(&GormUser) //儲存到資料庫

//更新用户
var GormUser = new(GormUser)
err:=db.Model(&GormUser).Where("phone = ?", "18888888888").
Update("phone", "13888888888").Error
if err !=nil {
//do something
}
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}


交易

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

//開啟
tx := db.Begin()

GormUser := GormUser{
Phone: "18888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}

if err := tx.Create(&GormUser).Error; err != nil {
tx.Rollback()
fmt.Println(err)
}

db.First(&GormUser, "phone = ?", "18888888888")
//交易提交
tx.Commit()
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}


日誌

package main

import (
"crypto/md5"
"encoding/hex"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"log"
"os"
)

var (
db *gorm.DB
sqlConnection = "root:a123456@tcp(127.0.0.1:3306)/xxx​"
)

//資料表結構
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}

//初始化
func init() {
//開啟資料庫連接
var err error
db, err = gorm.Open("mysql", sqlConnection)
if err != nil {
panic("failed to connect database")
}

//自動建立
db.AutoMigrate(&GormUser{})
}

func main() {
defer db.Close()
db.DB().SetMaxIdleConns(10)//閒置中的連線數上限
db.DB().SetMaxOpenConns(100)//開啟中的連線數上限

//開啟
tx := db.Begin()

GormUser := GormUser{
Phone: "18888888888",
Name: "Shirdon",
Password: md5Password("666666"), //使用者密碼
}

if err := tx.Create(&GormUser).Error; err != nil {
tx.Rollback()
fmt.Println(err)
}

db.First(&GormUser, "phone = ?", "18888888888")
//交易提交
tx.Commit()

db.LogMode(true)
db.SetLogger(log.New(os.Stdout, "\r\n", 0))
}

//md5加密
func md5Password(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}



avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
種類 SQL指令分三大部分: 資料定義語言(Data Definition Language,DDL):建立資料表、索引和檢視表等,和定義資料表的欄位。 資料操作語言(Data Manipulation Language,DML):資料表紀錄查詢、插入、刪除和更新指令。 資料控制語言(Dat
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
聚合函數 可以對資料的筆數、平均、最大、最小和加總的運算,提供查詢結果:如下表示: COUNT(Column):計算筆數,「*」是統計紀錄數。 AVG(Column):計算欄位平均值。 MAX(Column):計算欄位最大值。 MIN(Column):計算欄位最小值。 SUM(Colum
種類 SQL指令分三大部分: 資料定義語言(Data Definition Language,DDL):建立資料表、索引和檢視表等,和定義資料表的欄位。 資料操作語言(Data Manipulation Language,DML):資料表紀錄查詢、插入、刪除和更新指令。 資料控制語言(Dat
多條件查詢 AND運算子 SELECT *​ FROM your_table_name WHERE column1 LIKE '_value1%' AND column2 = number​2 OR運算子 SELECT *​ FROM your_table_name WHERE colu
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本篇文章深入淺出地介紹 Google Analytics 中的直接流量與間接流量,說明其差異與應用,並提供如何透過 UTM 標籤追蹤行銷活動成效的建議。文中區分「價值客群」與「同溫層客群」兩種行銷客群,提供更精準的行銷策略。
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
Thumbnail
之前已經與大家談過讓我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法當中的 G、O、S,現在就來繼續分享 T、A、R、T。請容我再次強調,這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本篇文章深入淺出地介紹 Google Analytics 中的直接流量與間接流量,說明其差異與應用,並提供如何透過 UTM 標籤追蹤行銷活動成效的建議。文中區分「價值客群」與「同溫層客群」兩種行銷客群,提供更精準的行銷策略。
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
Thumbnail
今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
Thumbnail
之前已經與大家談過讓我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法當中的 G、O、S,現在就來繼續分享 T、A、R、T。請容我再次強調,這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。