最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang?Gorm框架講解

 更新時(shí)間:2022年12月28日 15:43:56   作者:BigHead777  
gorm是一個(gè)使用Go語(yǔ)言編寫(xiě)的ORM框架,這篇文章主要介紹了golang?Gorm框架,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.gorm介紹

1.1介紹

全功能 ORM
關(guān)聯(lián) (Has One,Has Many,Belongs To,Many To Many,多態(tài),單表繼承)
Create,Save,Update,Delete,F(xiàn)ind 中鉤子方法
支持 Preload、Joins 的預(yù)加載
事務(wù),嵌套事務(wù),Save Point,Rollback To Saved Point
Context,預(yù)編譯模式,DryRun 模式
批量插入,F(xiàn)indInBatches,F(xiàn)ind/Create with Map,使用 SQL 表達(dá)式、Context Valuer 進(jìn)行 CRUD
SQL 構(gòu)建器,Upsert,數(shù)據(jù)庫(kù)鎖,Optimizer/Index/Comment Hint,命名參數(shù),子查詢
復(fù)合主鍵,索引,約束
Auto Migration
自定義 Logger
靈活的可擴(kuò)展插件 API:Database Resolver(多數(shù)據(jù)庫(kù),讀寫(xiě)分離)、Prometheus…
每個(gè)特性都經(jīng)過(guò)了測(cè)試的重重考驗(yàn)
開(kāi)發(fā)者友好

1.2安裝

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

2.使用

2.1創(chuàng)建表

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

//模型結(jié)構(gòu)
type Student struct {
	Id   int
	Name string
	Age  int
}

type User struct {
	gorm.Model
	Name string `gorm:"type:varchar(20);not null"`
	Telephone string `gorm:"varchar(110;not null;unique"`
	Password string `gorm:"size:255;not null"`
}
func main() {
	//使用dsn連接到數(shù)據(jù)庫(kù),grom自帶的數(shù)據(jù)庫(kù)池
	//賬號(hào):密碼@連接方式(ip地址:端口號(hào))/數(shù)據(jù)庫(kù)?語(yǔ)言方式,時(shí)區(qū)(未設(shè)置時(shí)區(qū)的話采用8小時(shí)制度)
	dsn := "root:mysql@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local"
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) //使用mysq連接數(shù)據(jù)庫(kù),第二個(gè)參數(shù)可以增加更多的配置(可有可無(wú))
	if err != nil {
		fmt.Println(err)
	}
	conn.AutoMigrate(&Student{}) //創(chuàng)建表?判斷是否表結(jié)構(gòu)存在
}

//多表創(chuàng)建
db.AutoMigrate(&Company{}, &Worker{})

2.2.添加數(shù)據(jù)

stu := &Student{
		Id:   3,
		Name: "li333",
		Age:  30,
	}
	res := conn.Create(stu) //向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)  ,它的返回值只有一個(gè)類(lèi)型,沒(méi)有error類(lèi)型
	//注:如果上面寫(xiě)成stu := Student{...},則這里寫(xiě)成Create(&stu)

	if res.Error != nil { //判斷是否插入數(shù)據(jù)出錯(cuò)
		fmt.Println(res.Error)
	}

2.3.查詢數(shù)據(jù)

var student Student
	//查詢First查詢一條
	conn.First(&student)
	fmt.Println(student)
	fmt.Println(student.Id)
	//條件查詢
	res := conn.First(&student, "name=? and id=?", "yang", 1)
	fmt.Println(res)
 //查詢所有 Find
	var stu []Student
	conn.Table("students").Find(&stu)
	for _, v := range stu {
		fmt.Println(v.Name)
	}

 // IN
	var students []Student
	conn.Table("students").Where("name IN ?", []string{"abc", "bili"}).Find(&students)
	fmt.Println(students)

	// LIKE
	db.Where("name LIKE ?", "%jin%").Find(&users)

	// AND
	db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)

	// Time
	db.Where("updated_at > ?", time.Date(2022,05,20,0,0,0,0,&time.Location{})).Find(&users)

	// BETWEEN
	db.Where("created_at BETWEEN ? AND ?", time.Date(2022,05,20,0,0,0,0,&time.Location{}), time.Now()).Find(&users)

2.4更新數(shù)據(jù)

  //更新數(shù)據(jù)
	conn.Table("students").Where("id=?", 1).Update("name", "ttt")
	conn.Table("students").Where("id=?", 2).Updates(&Student{Name: "bili", Age: 10})
	//按主鍵更新,傳入結(jié)構(gòu)體對(duì)象,根據(jù)對(duì)應(yīng)主鍵更新相應(yīng)內(nèi)容
  dbConn.Table("user").Save(&user1)

2.5刪除數(shù)據(jù)

conn.Table("students").Where("id=?", 1).Delete(&Student{})

2.6執(zhí)行原生sql

conn.Raw("select * from students where id=?", 3).Scan(&student)
fmt.Println(student)

db.Exec("DROP TABLE users")
db.Exec("UPDATE orders SET shipped_at=? WHERE id IN ?", time.Now(), []int64{1,2,3})

3.一對(duì)一

3.1創(chuàng)建表

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	CreditCard CreditCard
	Name       string
}

type CreditCard struct {
	gorm.Model
	Number string
	UserID uint
}

func main() {
	//使用dsn連接到數(shù)據(jù)庫(kù),grom自帶的數(shù)據(jù)庫(kù)池
	//賬號(hào):密碼@連接方式(ip地址:端口號(hào))/數(shù)據(jù)庫(kù)?語(yǔ)言方式,時(shí)區(qū)(未設(shè)置時(shí)區(qū)的話采用8小時(shí)制度)
	dsn := "root:mysql@tcp(127.0.0.1:3306)/crow?charset=utf8mb4&parseTime=True&loc=Local"
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) //使用mysq連接數(shù)據(jù)庫(kù),第二個(gè)參數(shù)可以增加更多的配置(可有可無(wú))
	if err != nil {
		fmt.Println(err)
	}
	conn.AutoMigrate(&User{})
	conn.AutoMigrate(&CreditCard{})

	//創(chuàng)建表?判斷是否表結(jié)構(gòu)存在
	user := &User{
		Name: "李四",
	}

	conn.Create(user)

	card := &CreditCard{
		Number: "123",
		UserID: 1,
	}
	conn.Create(card)

}

3.2多態(tài)關(guān)聯(lián)

//多態(tài)關(guān)聯(lián)
//GORM 為 has one 和 has many 提供了多態(tài)關(guān)聯(lián)支持,它會(huì)將擁有者實(shí)體的表名、主鍵值都保存到多態(tài)類(lèi)型的字段中。

type Cat struct {
  ID    int
  Name  string
  Toy   Toy `gorm:"polymorphic:Owner;"`
}

type Dog struct {
  ID   int
  Name string
  Toy  Toy `gorm:"polymorphic:Owner;"`
}

type Toy struct {
  ID        int
  Name      string
  OwnerID   int
  OwnerType string
}

db.Create(&Dog{Name: "dog1", Toy: Toy{Name: "toy1"}})
// INSERT INTO `dogs` (`name`) VALUES ("dog1")
// INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","dogs")

3.3外鍵約束

你可以通過(guò)為標(biāo)簽 constraint 配置 OnUpdate、OnDelete 實(shí)現(xiàn)外鍵約束,在使用 GORM 進(jìn)行遷移時(shí)它會(huì)被創(chuàng)建,例如:

type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}

type Company struct {
  ID   int
  Name string
}

4.一對(duì)多

Has Many
has many 與另一個(gè)模型建立了一對(duì)多的連接。 不同于 has one,擁有者可以有零或多個(gè)關(guān)聯(lián)模型。

例如,您的應(yīng)用包含 user 和 credit card 模型,且每個(gè) user 可以有多張 credit card。

// User 有多張 CreditCard,UserID 是外鍵
type User struct {
  gorm.Model
  CreditCards []CreditCard
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}
package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)


type User struct {
	gorm.Model
	MemberNumber string       `gorm:"varchar(110;not null;unique"`
	CreditCards  []CreditCard `gorm:"foreignKey:UserNumber;references:MemberNumber"`
	Name         string
}

type CreditCard struct {
	gorm.Model
	Number     string
	UserNumber string `gorm:"varchar(110;not null;unique"`
}

func main() {
	//使用dsn連接到數(shù)據(jù)庫(kù),grom自帶的數(shù)據(jù)庫(kù)池
	//賬號(hào):密碼@連接方式(ip地址:端口號(hào))/數(shù)據(jù)庫(kù)?語(yǔ)言方式,時(shí)區(qū)(未設(shè)置時(shí)區(qū)的話采用8小時(shí)制度)
	dsn := "root:mysql@tcp(127.0.0.1:3306)/crow?charset=utf8mb4&parseTime=True&loc=Local"
	conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) //使用mysq連接數(shù)據(jù)庫(kù),第二個(gè)參數(shù)可以增加更多的配置(可有可無(wú))
	if err != nil {
		fmt.Println(err)
	}
	conn.AutoMigrate(&User{}, &CreditCard{})
	user := User{
		Name:         "ttt3",
		MemberNumber: "1003",
	}
	conn.Create(&user)
	card := CreditCard{
		Number:     "111",
		UserNumber: user.MemberNumber,
	}
	conn.Create(&card)

}


5.多對(duì)多

Many To Many

Many to Many 會(huì)在兩個(gè) model 中添加一張連接表。

例如,您的應(yīng)用包含了 user 和 language,且一個(gè) user 可以說(shuō)多種 language,多個(gè) user 也可以說(shuō)一種 language。

// User 擁有并屬于多種 language,`user_languages` 是連接表
type User struct {
  gorm.Model
  Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
  gorm.Model
  Name string
}

當(dāng)使用 GORM 的 AutoMigrateUser 創(chuàng)建表時(shí),GORM 會(huì)自動(dòng)創(chuàng)建連接表

反向引用

// User 擁有并屬于多種 language,`user_languages` 是連接表
type User struct {
  gorm.Model
  Languages []*Language `gorm:"many2many:user_languages;"`
}

type Language struct {
  gorm.Model
  Name string
  Users []*User `gorm:"many2many:user_languages;"`
}

重寫(xiě)外鍵

對(duì)于 many2many 關(guān)系,連接表會(huì)同時(shí)擁有兩個(gè)模型的外鍵,例如:

type User struct {
  gorm.Model
  Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
  gorm.Model
  Name string
}

// Join Table: user_languages
//   foreign key: user_id, reference: users.id
//   foreign key: language_id, reference: languages.id

若要重寫(xiě)它們,可以使用標(biāo)簽 foreignKey、reference、joinforeignKey、joinReferences。當(dāng)然,您不需要使用全部的標(biāo)簽,你可以僅使用其中的一個(gè)重寫(xiě)部分的外鍵、引用。

type User struct {
    gorm.Model
    Profiles []Profile `gorm:"many2many:user_profiles;foreignKey:Refer;joinForeignKey:UserReferID;References:UserRefer;JoinReferences:UserRefer"`
    Refer    uint
}

type Profile struct {
    gorm.Model
    Name      string
    UserRefer uint
}

// 會(huì)創(chuàng)建連接表:user_profiles
//   foreign key: user_refer_id, reference: users.refer
//   foreign key: profile_refer, reference: profiles.user_refer

自引用 Many2Many

自引用 many2many 關(guān)系

type User struct {
  gorm.Model
    Friends []*User `gorm:"many2many:user_friends"`
}

// 會(huì)創(chuàng)建連接表:user_friends
//   foreign key: user_id, reference: users.id
//   foreign key: friend_id, reference: users.id

6.獲取多表數(shù)據(jù)

預(yù)加載

GORM 允許在 Preload 的其它 SQL 中直接加載關(guān)系,例如:

type User struct {
  gorm.Model
  Username string
  Orders   []Order
}

type Order struct {
  gorm.Model
  UserID uint
  Price  float64
}

// 查找 user 時(shí)預(yù)加載相關(guān) Order
db.Preload("Orders").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4);

db.Preload("Orders").Preload("Profile").Preload("Role").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4); // has many
// SELECT * FROM profiles WHERE user_id IN (1,2,3,4); // has one
// SELECT * FROM roles WHERE id IN (4,5,6); // belongs to

Joins 預(yù)加載

Preload 在一個(gè)單獨(dú)查詢中加載關(guān)聯(lián)數(shù)據(jù)。而 Join Preload 會(huì)使用 inner join 加載關(guān)聯(lián)數(shù)據(jù),例如:

db.Joins("Company").Joins("Manager").Joins("Account").First(&user, 1)
db.Joins("Company").Joins("Manager").Joins("Account").First(&user, "users.name = ?", "jinzhu")
db.Joins("Company").Joins("Manager").Joins("Account").Find(&users, "users.id IN ?", []int{1,2,3,4,5})

注意 Join Preload 適用于一對(duì)一的關(guān)系,例如: has one, belongs to

預(yù)加載全部

與創(chuàng)建、更新時(shí)使用 Select 類(lèi)似,clause.Associations 也可以和 Preload 一起使用,它可以用來(lái) 預(yù)加載 全部關(guān)聯(lián),例如:

type User struct {
  gorm.Model
  Name       string
  CompanyID  uint
  Company    Company
  Role       Role
}

db.Preload(clause.Associations).Find(&users)

帶條件的預(yù)加載

GORM 允許帶條件的 Preload 關(guān)聯(lián),類(lèi)似于內(nèi)聯(lián)條件

// 帶條件的預(yù)加載 Order
db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');

db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users WHERE state = 'active';
// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');

自定義預(yù)加載 SQL

您可以通過(guò) func(db *gorm.DB) *gorm.DB 實(shí)現(xiàn)自定義預(yù)加載 SQL,例如:

db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
  return db.Order("orders.amount DESC")
}).Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;

嵌套預(yù)加載

GORM 支持嵌套預(yù)加載,例如:

db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users)

// 自定義預(yù)加載 `Orders` 的條件
// 這樣,GORM 就不會(huì)加載不匹配的 order 記錄
db.Preload("Orders", "state = ?", "paid").Preload("Orders.OrderItems").Find(&users)

到此這篇關(guān)于golang Gorm框架的文章就介紹到這了,更多相關(guān)golang Gorm框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go-cqhttp智能聊天功能的實(shí)現(xiàn)

    go-cqhttp智能聊天功能的實(shí)現(xiàn)

    這篇文章主要介紹了go-cqhttp智能聊天功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Go中Context使用源碼解析

    Go中Context使用源碼解析

    這篇文章主要為大家介紹了Go中Context使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作

    使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作

    這篇文章主要介紹了使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Go語(yǔ)言實(shí)現(xiàn)JSON解析的神器詳解

    Go語(yǔ)言實(shí)現(xiàn)JSON解析的神器詳解

    php轉(zhuǎn)go是大趨勢(shì),越來(lái)越多公司的php服務(wù)都在用go進(jìn)行重構(gòu),重構(gòu)過(guò)程中,會(huì)發(fā)現(xiàn)php的json解析操作是真的香。本文和大家分享了一個(gè)Go語(yǔ)言實(shí)現(xiàn)JSON解析的神器,希望對(duì)大家有所幫助
    2023-01-01
  • Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    反射的本質(zhì)就是在程序運(yùn)行的時(shí)候,獲取對(duì)象的類(lèi)型信息和內(nèi)存結(jié)語(yǔ)構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下
    2022-06-06
  • Golang Model 字段自動(dòng)化校驗(yàn)設(shè)計(jì)方案

    Golang Model 字段自動(dòng)化校驗(yàn)設(shè)計(jì)方案

    在我們?nèi)粘i_(kāi)發(fā)中,不可避免的總要去進(jìn)行各種參數(shù)校驗(yàn),但是如果在某個(gè)場(chǎng)景中,要校驗(yàn)的字段非常多,并且在其中還有耦合關(guān)系,那么我們手寫(xiě)校驗(yàn)邏輯就變得非常的低效且難以維護(hù),本篇文檔就基于 DDD 領(lǐng)域模型設(shè)計(jì)的思想下,提供自動(dòng)化的校驗(yàn)?zāi)P妥侄?感興趣的朋友一起看看吧
    2025-02-02
  • Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析

    Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析

    這篇文章主要為大家介紹了Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • GO?env環(huán)境變量配置命令使用

    GO?env環(huán)境變量配置命令使用

    這篇文章主要為大家介紹了GO?env環(huán)境變量配置命令使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go語(yǔ)言開(kāi)發(fā)區(qū)塊鏈只需180行代碼(推薦)

    Go語(yǔ)言開(kāi)發(fā)區(qū)塊鏈只需180行代碼(推薦)

    這篇文章主要介紹了Go語(yǔ)言開(kāi)發(fā)區(qū)塊鏈只需180行代碼,文章中將不會(huì)涉及工作量證明算法(PoW)以及權(quán)益證明算法(PoS)這類(lèi)的共識(shí)算法。需要的朋友可以參考下
    2018-05-05
  • 一文帶你了解Go語(yǔ)言中的單元測(cè)試

    一文帶你了解Go語(yǔ)言中的單元測(cè)試

    寫(xiě)過(guò)單元測(cè)試的開(kāi)發(fā)人員應(yīng)該理解,單元測(cè)試最核心的價(jià)值是為了證明:為什么我寫(xiě)的代碼是正確的?也就是從邏輯角度幫你檢查你的代碼。本文就來(lái)和大家詳細(xì)聊聊Go語(yǔ)言中的單元測(cè)試,需要的可以參考一下
    2022-07-07

最新評(píng)論

枝江市| 福贡县| 荣成市| 车致| 车致| 旌德县| 大冶市| 宝坻区| 积石山| 丰顺县| 南开区| 五原县| 蓬溪县| 长岭县| 墨脱县| 平乡县| 松桃| 庆元县| 浪卡子县| 景泰县| 封丘县| 沙洋县| 平南县| 宜春市| 邵东县| 沁阳市| 滦平县| 昭通市| 达孜县| 大埔县| 长汀县| 竹北市| 乌苏市| 凤山市| 德惠市| 宁晋县| 淮南市| 临湘市| 景泰县| 濉溪县| 建德市|