go培訓(xùn)課程都學(xué)什么?xorm框架學(xué)習(xí)系列(二):xorm結(jié)構(gòu)體映射規(guī)則和表操作

上節(jié)內(nèi)容我們學(xué)習(xí)了基本的xorm框架的知識和基礎(chǔ)配置的相關(guān)信息。本節(jié)課內(nèi)容我們繼續(xù)學(xué)習(xí)相關(guān)的知識和相關(guān)操作。

名稱映射規(guī)則

名稱映射規(guī)則主要負(fù)責(zé)結(jié)構(gòu)體名稱到表名和結(jié)構(gòu)體field到表字段的名稱映射。在xorm框架中由core.IMapper接口的實現(xiàn)者來管理,xorm內(nèi)置了三種IMapper實現(xiàn):core.SnakeMapper,core.SameMappercore.GonicMapper。

SnakeMapper:支持struct為駝峰式命名,表結(jié)構(gòu)中為下劃線命名之間的轉(zhuǎn)換。該種規(guī)則為xorm默認(rèn)的Maper;

SameMapper:映射規(guī)則支持結(jié)構(gòu)體名稱和對應(yīng)的表名稱以及結(jié)構(gòu)體field名稱與對應(yīng)的表字段名稱相同的命名;

GonicMapper:該映射規(guī)則和駝峰式命名類似,但是對于特定詞支持性更好,比如ID將會翻譯成id,而不是駝峰式的i_d。

默認(rèn)的名稱映射規(guī)則為SnakeMapper,如果開發(fā)者需要改變時,可以使用創(chuàng)建的數(shù)據(jù)庫引擎對象進(jìn)行如下設(shè)置:

engine.SetMapper(core.SameMapper{})

另外,可以設(shè)置表名和表字段分別為不同的映射規(guī)則:

engine.SetTableMapper(core.SameMapper{})

engine.SetColumnMapper(core.SnakeMapper{})

使用Tag的映射規(guī)則

如果所有的命名都是按照IMapper的映射來操作的,那當(dāng)然是最理想的。但是如果碰到某個表名或者某個字段名跟映射規(guī)則不匹配時,我們就需要別的機(jī)制來改變。xorm提供了如下幾種方式來進(jìn)行:

如果結(jié)構(gòu)體擁有TableName() string的成員方法,那么此方法的返回值即是該結(jié)構(gòu)體對應(yīng)的數(shù)據(jù)庫表名。

通過engine.Table()方法可以改變struct對應(yīng)的數(shù)據(jù)庫表的名稱,通過sturct中field對應(yīng)的Tag中使用xorm:"'column_name'"可以使該field對應(yīng)的Column名稱為指定名稱。這里使用兩個單引號將Column名稱括起來是為了防止名稱沖突,因為我們在Tag中還可以對這個Column進(jìn)行更多的定義。如果名稱不沖突的情況,單引號也可以不使用。

Column屬性定義

我們在field對應(yīng)的Tag中對Column的一些屬性進(jìn)行定義,用于對我們的項目中的數(shù)據(jù)庫表字段進(jìn)行設(shè)置和限定。定義的方法基本和我們寫SQL定義表結(jié)構(gòu)類似。如下所示:

type User struct {

?? Id ? int64

?? Name string? `xorm:"varchar(25) notnull unique 'usr_name'"`

}

xorm中對數(shù)據(jù)類型有自己的定義,具體的Tag規(guī)則如下,另Tag中的關(guān)鍵字均不區(qū)分大小寫:

name當(dāng)前field對應(yīng)的字段的名稱

pk是否是Primary Key

name當(dāng)前field對應(yīng)的字段的名稱

pk是否是Primary Key

autoincr是否是自增

[not ]null 或 notnull是否可以為空

unique是否是唯一

index是否是索引

| extends | 應(yīng)用于一個匿名成員結(jié)構(gòu)體或者非匿名成員結(jié)構(gòu)體之上? | - | 這個Field將不進(jìn)行字段映射 || -> | Field將只寫入到數(shù)據(jù)庫而不從數(shù)據(jù)庫讀取 || <- | Field將只從數(shù)據(jù)庫讀取,而不寫入到數(shù)據(jù)庫 || created | Field將在Insert時自動賦值為當(dāng)前時間 || updated | Field將在Insert或Update時自動賦值為當(dāng)前時間 ||deleted | Field將在Delete時設(shè)置為當(dāng)前時間,并且當(dāng)前記錄不刪除 || version | Field將會在insert時默認(rèn)為1,每次更新自動加1 || default 0或default(0) | 設(shè)置默認(rèn)值,緊跟的內(nèi)容如果是Varchar等需要加上單引號 || json | 表示內(nèi)容將先轉(zhuǎn)成Json格式 |

字段映射規(guī)則

除了上述表名的映射規(guī)則和使用Tag對字段進(jìn)行設(shè)置以外,基礎(chǔ)的Go語言結(jié)構(gòu)體數(shù)據(jù)類型也會對應(yīng)到數(shù)據(jù)庫表中的字段中,具體的一些數(shù)據(jù)類型對應(yīng)規(guī)則如下:

Go語言數(shù)據(jù)類型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

表基本操作

創(chuàng)建表:CreateTables(),參數(shù)為一個或多個空的對應(yīng)Struct的指針。

判斷表是否為空:IsTableEmpty()

判斷表是否存在:IsTableExist()

刪除表:DropTables(),參數(shù)為一個或多個空的對應(yīng)Struct的指針或者表的名字。

基本和統(tǒng)計操作

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

具體的編程使用方法我們在視頻和程序中會給大家詳細(xì)使用,這是我們實戰(zhàn)項目的重點內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容