天天看點

GORM學習指南

orm是一個使用Go語言編寫的ORM架構。它文檔齊全,對開發者友好,支援主流資料庫。

Github GORM

中文官方網站内含十分齊全的中文文檔,有了它你甚至不需要再繼續向下閱讀本文。

連接配接不同的資料庫都需要導入對應資料的驅動程式,GORM已經貼心的為我們包裝了一些驅動程式,隻需要按如下方式導入需要的資料庫驅動即可:

基本代碼同上,注意引入對應postgres驅動并正确指定gorm.Open()參數。

基本代碼同上,注意引入對應sqlite驅動并正确指定gorm.Open()參數。

基本代碼同上,注意引入對應mssql驅動并正确指定gorm.Open()參數。

注意:

本文以MySQL資料庫為例,講解GORM各項功能的主要使用方法。

往下閱讀本文前,你需要有一個能夠成功連接配接上的MySQL資料庫執行個體。

在使用GORM前手動建立資料庫db1:

使用GORM連接配接上面的db1進行建立、查詢、更新、删除操作。

在使用ORM工具時,通常我們需要在代碼中定義模型(Models)與資料庫中的資料表進行映射,在GORM中模型(Models)通常是正常定義的結構體、基本的go類型或它們的指針。 同時也支援sql.Scanner及driver.Valuer接口(interfaces)。

為了友善模型定義,GORM内置了一個gorm.Model結構體。gorm.Model是一個包含了ID, CreatedAt, UpdatedAt, DeletedAt四個字段的Golang結構體。

  你可以将它嵌入到你自己的模型中:

 當然你也可以完全自己定義模型:

使用結構體聲明模型時,标記(tags)是可選項。gorm支援以下标記:

GORM學習指南

GORM 預設會使用名為ID的字段作為表的主鍵。

表名預設就是結構體名稱的複數,例如:

也可以通過Table()指定表名:

GORM還支援更改預設表名稱規則:

列名由字段名稱進行下劃線分割來生成

 可以使用結構體tag指定列名:

如果模型有 CreatedAt字段,該字段的值将會是初次建立記錄的時間。

如果模型有UpdatedAt字段,該字段的值将會是每次更新記錄的時間。

如果模型有DeletedAt字段,調用Delete删除該記錄時,将會設定DeletedAt字段為目前時間,而不是直接将記錄從資料庫中删除。

首先定義模型:

使用使用NewRecord()查詢主鍵是否存在,主鍵為空使用Create()建立記錄:

可以通過 tag 定義字段的預設值,比如:

注意:通過tag定義字段的預設值,在建立記錄時候生成的 SQL 語句會排除沒有值或值為 零值 的字段。 在将記錄插入到資料庫後,Gorm會從資料庫加載那些字段的預設值。

舉個例子:

上面代碼實際執行的SQL語句是INSERT INTO users("age") values('99');,排除了零值字段Name,而在資料庫中這一條資料會使用設定的預設值小王子作為Name字段的值。

注意:所有字段的零值, 比如0, "",false或者其它零值,都不會儲存到資料庫内,但會使用他們的預設值。 如果你想避免這種情況,可以考慮使用指針或實作 Scanner/Valuer接口,比如:

 

例如PostgreSQL資料庫中可以使用下面的方式實作合并插入, 有則更新, 無則插入。

GORM學習指南
GORM學習指南

一般查詢

GORM學習指南
GORM學習指南

普通sql查詢

GORM學習指南
GORM學習指南

struct&Map查詢

提示:當通過結構體進行查詢時,GORM将會隻通過非零值字段查詢,這意味着如果你的字段值為0,'',false或者其他零值時,将不會被用于建構查詢條件,例如:

你可以使用指針或實作 Scanner/Valuer 接口來避免這個問題.

GORM學習指南
GORM學習指南

not條件

GORM學習指南
GORM學習指南

OR條件

GORM學習指南
GORM學習指南

内聯條件

擷取比對的第一條記錄,否則根據給定的條件初始化一個新的對象 (僅支援 struct 和 map 條件)

Attrs:如果記錄未找到,将使用參數初始化 struct.

GORM學習指南
GORM學習指南

Attrs

Assign:不管記錄是否找到,都将參數指派給 struct.

GORM學習指南
GORM學習指南

Assign

擷取比對的第一條記錄, 否則根據給定的條件建立一個新的記錄 (僅支援 struct 和 map 條件)

GORM學習指南
GORM學習指南
GORM學習指南
GORM學習指南
GORM學習指南
GORM學習指南

子查詢

GORM學習指南
GORM學習指南

選擇字段

GORM學習指南
GORM學習指南

排序

GORM學習指南
GORM學習指南

數量limit

GORM學習指南
GORM學習指南

偏移offset

GORM學習指南
GORM學習指南

總數count

GORM學習指南
GORM學習指南

having & group

GORM學習指南
GORM學習指南

連接配接

Pluck,查詢 model 中的一個列作為切片,如果您想要查詢多個列,您應該使用 Scan

GORM學習指南
GORM學習指南

pluck

Scan,掃描結果至一個 struct.

GORM學習指南
GORM學習指南

scan

Method Chaining,Gorm 實作了鍊式操作接口,是以你可以把代碼寫成這樣:

在調用立即執行方法前不會生成Query語句,借助這個特性你可以建立一個函數來處理一些通用邏輯。

立即執行方法

Immediate methods ,立即執行方法是指那些會立即生成SQL語句并發送到資料庫的方法, 他們一般是CRUD方法,比如:

這有一個基于上面鍊式方法代碼的立即執行方法的例子:

生成的SQL語句如下:

Scopes,Scope是建立在鍊式操作的基礎之上的。

基于它,你可以抽取一些通用邏輯,寫出更多可重用的函數庫。

Multiple Immediate Methods,在 GORM 中使用多個立即執行方法時,後一個立即執行方法會複用前一個立即執行方法的條件 (不包括内聯條件) 。

生成的 Sql

Save()預設會更新該對象的所有字段,即使你沒有指派。

如果你隻希望更新指定字段,可以使用Update或者Updates

如果你想更新或忽略某些字段,你可以使用 Select,Omit

上面的更新操作會自動運作 model 的 BeforeUpdate, AfterUpdate 方法,更新 UpdatedAt 時間戳, 在更新時儲存其 Associations, 如果你不想調用這些方法,你可以使用 UpdateColumn, UpdateColumns

批量更新時Hooks(鈎子函數)不會運作。

先查詢表中的第一條資料儲存至user變量。

如果你想修改 BeforeUpdate, BeforeSave 等 Hooks 中更新的值,你可以使用 scope.SetColumn, 例如:

警告 删除記錄時,請確定主鍵字段有值,GORM 會通過主鍵去删除記錄,如果主鍵為空,GORM 會删除該 model 的所有記錄。

删除全部比對的記錄

如果一個 model 有 DeletedAt 字段,他将自動獲得軟删除的功能! 當調用 Delete 方法時, 記錄不會真正的從資料庫中被删除, 隻會将DeletedAt 字段的值會被設定為目前時間

GORM學習指南

作者:張亞飛

gitee:https://gitee.com/zhangyafeii

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。