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 預設會使用名為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資料庫中可以使用下面的方式實作合并插入, 有則更新, 無則插入。
一般查詢
普通sql查詢
struct&Map查詢
提示:當通過結構體進行查詢時,GORM将會隻通過非零值字段查詢,這意味着如果你的字段值為0,'',false或者其他零值時,将不會被用于建構查詢條件,例如:
你可以使用指針或實作 Scanner/Valuer 接口來避免這個問題.
not條件
OR條件
内聯條件
擷取比對的第一條記錄,否則根據給定的條件初始化一個新的對象 (僅支援 struct 和 map 條件)
Attrs:如果記錄未找到,将使用參數初始化 struct.
Attrs
Assign:不管記錄是否找到,都将參數指派給 struct.
Assign
擷取比對的第一條記錄, 否則根據給定的條件建立一個新的記錄 (僅支援 struct 和 map 條件)
子查詢
選擇字段
排序
數量limit
偏移offset
總數count
having & group
連接配接
Pluck,查詢 model 中的一個列作為切片,如果您想要查詢多個列,您應該使用 Scan
pluck
Scan,掃描結果至一個 struct.
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 字段的值會被設定為目前時間
作者:張亞飛
gitee:https://gitee.com/zhangyafeii
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。