上節內容我們學習了基本的xorm框架的知識和基礎配置的相關信息。本節課內容我們繼續學習相關的知識和相關操作。
名稱映射規則
名稱映射規則主要負責結構體名稱到表名和結構體field到表字段的名稱映射。 在xorm框架中由core.IMapper接口的實現者來管理,xorm內置了三種IMapper實現:core.SnakeMapper,core.SameMapper和core.GonicMapper。
-
-
SameMapper:映射規則支持結構體名稱和對應的表名稱以及結構體field名稱與對應的表字段名稱相同的命名;
-
GonicMapper:該映射規則和駝峰式命名類似,但是對於特定詞支持性更好,比如ID將會翻譯成id,而不是駝峰式的i_d。
默認的名稱映射規則為SnakeMapper,如果開發者需要改變時,可以使用創建的數據庫引擎對象進行如下設置:
engine.SetMapper(core.SameMapper{})
另外,可以設置表名和表字段分別為不同的映射規則:
engine.SetTableMapper(core.SameMapper{})
engine.SetColumnMapper(core.SnakeMapper{})
使用Tag的映射規則
如果所有的命名都是按照IMapper的映射來操作的,那當然是最理想的。但是如果碰到某個表名或者某個字段名跟映射規則不匹配時,我們就需要別的機制來改變。 xorm提供了如下幾種方式來進行:
-
如果結構體擁有TableName() string的成員方法,那么此方法的返回值即是該結構體對應的數據庫表名。
-
通過engine.Table()方法可以改變struct對應的數據庫表的名稱,通過sturct中field對應的Tag中使用xorm:"'column_name'"可以使該field對應的Column名稱為指定名稱。這里使用兩個單引號將Column名稱括起來是為了防止名稱沖突,因為我們在Tag中還可以對這個Column進行更多的定義。如果名稱不沖突的情況,單引號也可以不使用。
Column屬性定義
我們在field對應的Tag中對Column的一些屬性進行定義,用於對我們的項目中的數據庫表字段進行設置和限定。定義的方法基本和我們寫SQL定義表結構類似。如下所示:
type User struct {
Id int64
Name string `xorm:"varchar(25) notnull unique 'usr_name'"`
}
xorm中對數據類型有自己的定義,具體的Tag規則如下,另Tag中的關鍵字均不區分大小寫:
name | 當前field對應的字段的名稱 |
---|---|
pk | 是否是Primary Key |
name | 當前field對應的字段的名稱 |
pk | 是否是Primary Key |
autoincr | 是否是自增 |
[not ]null 或 notnull | 是否可以為空 |
unique | 是否是唯一 |
index | 是否是索引 |
| extends | 應用於一個匿名成員結構體或者非匿名成員結構體之上 | - | 這個Field將不進行字段映射 | | -> | Field將只寫入到數據庫而不從數據庫讀取 | | <- | Field將只從數據庫讀取,而不寫入到數據庫 | | created | Field將在Insert時自動賦值為當前時間 | | updated | Field將在Insert或Update時自動賦值為當前時間 | |deleted | Field將在Delete時設置為當前時間,並且當前記錄不刪除 | | version | Field將會在insert時默認為1,每次更新自動加1 | | default 0或default(0) | 設置默認值,緊跟的內容如果是Varchar等需要加上單引號 | | json | 表示內容將先轉成Json格式 |
字段映射規則
除了上述表名的映射規則和使用Tag對字段進行設置以外,基礎的Go語言結構體數據類型也會對應到數據庫表中的字段中,具體的一些數據類型對應規則如下:
Go語言數據類型 | xorm 中的類型 |
---|---|
implemented Conversion | Text |
int, int8, int16, int32, uint, uint8, uint16, uint32 | Int |
int64, uint64 | BigInt |
float32 | Float |
float64 | Double |
complex64, complex128 | Varchar(64) |
[]uint8 | Blob |
array, slice, map except []uint8 | Text |
bool | Bool |
string | Varchar(255) |
time.Time | DateTime |
cascade struct | BigInt |
struct | Text |
Others | Text |
表基本操作
-
創建表:CreateTables(),參數為一個或多個空的對應Struct的指針。
-
判斷表是否為空:IsTableEmpty()
-
判斷表是否存在:IsTableExist()
-
刪除表:DropTables(),參數為一個或多個空的對應Struct的指針或者表的名字。
基本和統計操作
查詢和統計主要使用Get, Find, Count, Rows, Iterate這幾個方法,以及條件查詢Where。
具體的編程使用方法我們在視頻和程序中會給大家詳細使用,這是我們實戰項目的重點內容。