go培訓課程都學什麼?xorm框架學習系列(二):xorm結構體對映規則和表操作

qfDavie發表於2019-04-02

上節內容我們學習了基本的xorm框架的知識和基礎配置的相關資訊。本節課內容我們繼續學習相關的知識和相關操作。

名稱對映規則

名稱對映規則主要負責結構體名稱到表名和結構體field到表欄位的名稱對映。 在xorm框架中由core.IMapper介面的實現者來管理,xorm內建了三種IMapper實現:core.SnakeMapper,core.SameMappercore.GonicMapper

  • SnakeMapper:支援struct為駝峰式命名,表結構中為下劃線命名之間的轉換。該種規則為xorm預設的Maper;

  • 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 ConversionText
int, int8, int16, int32, uint, uint8, uint16, uint32Int
int64, uint64BigInt
float32Float
float64Double
complex64, complex128Varchar(64)
[]uint8Blob
array, slice, map except []uint8Text
boolBool
stringVarchar(255)
time.TimeDateTime
cascade structBigInt
structText
OthersText

表基本操作

  • 建立表:CreateTables(),引數為一個或多個空的對應Struct的指標。

  • 判斷表是否為空:IsTableEmpty()

  • 判斷表是否存在:IsTableExist()

  • 刪除表:DropTables(),引數為一個或多個空的對應Struct的指標或者表的名字。

基本和統計操作

查詢和統計主要使用Get, Find, Count, Rows, Iterate這幾個方法,以及條件查詢Where。

具體的程式設計使用方法我們在視訊和程式中會給大家詳細使用,這是我們實戰專案的重點內容。



相關文章