《西遊記》是我看過最多遍的小說,《甘十九妹》是我看過最多遍的電視劇,或許是我想學會孫悟空的神通廣大,然後去江湖裡挽救那個『不知何故落人間』的甘妹,那個說過『人生天地,如果能把持住是非曲直,敢愛敢恨,恩怨分明,就不愧人生天地一場。』的奇女子,那首二十餘年仍在腦海中徘徊的《如果來生還是今世的重複》。
最近在無意中看到了 Facebook 出品的一個 Golang ORM 庫—— ent
,初步翻閱了一遍文件後,有種強烈的衝動,用它來實現甘妹江湖,儘管它不能拯救我的甘妹,卻能讓我具現出她的銀碗盛雪。
江湖畫布
先建立出一個江湖吧,不然我顛倒乾坤的甘妹放哪裡呢?
mkdir /resources/codes/golang/ganshijiumei && cd $_
go mod init github.com/BiLuoHui/ganshijiumei
上面兩句不擺了噻,諸君肯定比我懂,初始化的江湖是這樣的:
馬良神筆
要畫出《甘十九妹》的江湖,先得買支筆噻,我這裡選了 ent:
go get github.com/facebookincubator/ent/cmd/entc
如此,你將會看到這支筆 entc
。插,怎麼多了個 c
,好吧,其實我不知道,也不關心。挺好的,這個 c
就當是甘妹臉上那張遮住她絕世容顏的輕紗了。
門派與江湖兒女
走江湖的總得弄碗江湖的水喝喝,行走江湖的人多半都是某個門派的弟子,就如甘妹來自丹楓軒,劍平雖然歷事多師,本沒有歸附於某個門派,但在岳陽門覆滅之時,答應冼冰做岳陽門忠貞不二的弟子,也就此開啟了與甘妹的愛恨糾纏。
建立 Schema
所以我們先定義兩個 Schema,一曰 MenPai,二曰 JiangHuRen。是的,你們沒有看錯,它們是拼音,我不會告訴諸君我英語很爛,更何況我也不認為英語有這樣的詞彙。管他呢,讀者諸君就當它們是時下流行的 fanny mud pee 吧。
entc init MenPai JiangHuRen
現在江湖是這樣的:
儘管在 build 時會自動 download 相關的庫,但有強迫症的我還是先 get
一下:
go get -u github.com/facebookincubator/ent
門派
剛建立的門派 Schema 長這樣:
package schema
import "github.com/facebookincubator/ent"
// MenPai holds the schema definition for the MenPai entity.
type MenPai struct {
ent.Schema
}
// Fields of the MenPai.
func (MenPai) Fields() []ent.Field {
return nil
}
// Edges of the MenPai.
func (MenPai) Edges() []ent.Edge {
return nil
}
稍稍提一下:
- Fields 函式定義一個 Entity 的屬性。
- Edges 函式定義一個 Entity 與其他 Entity 的關係,換個詞叫 relations,Edge 是圖這種資料結構的邊界。
一個門派肯定有名字和地址對吧:
// Fields of the MenPai.
func (MenPai) Fields() []ent.Field {
return []ent.Field{
field.String("name").Unique().Comment("門派名號"),
field.String("address").Default("").Comment("門派府臺尊地"),
}
}
Mixin
通常輝煌歷史有助於門派在江湖上叫字號,比如岳陽門就有300年的基業;而門派最近一次招收弟子是什麼時候呢,有助於江湖人知道它是否還活躍於江湖,比如岳陽門最近一次招收弟子就是在月餘前,那個人就是劍平大帥哥。對於江湖人也有類似的情況,比如姑娘你出生在什麼時候,最後一次跟小和尚唱《皈依》是什麼時候呢。
所以本著躺著不能坐著的原則我們建立一個 Mixin
:
touch ent/schema/mixin.go
然後來定義怎麼記下你的生日,及你最後一次跟小和尚唱《皈依》的時間:
package schema
import (
"github.com/facebookincubator/ent"
"github.com/facebookincubator/ent/schema/field"
"time"
)
type TimeMixin struct{}
func (TimeMixin) Fields() []ent.Field {
return []ent.Field{
field.Time("created_at").
Immutable().
Default(time.Now),
field.Time("updated_at").
Default(time.Now).
UpdateDefault(time.Now),
}
}
Immutable 函式告訴我們,生下來後你的出生年月就定了,不能改變。你明明是半老徐娘就不說自己芳齡十八。
然後我們給門派加上這兩個屬性:
// menpai.go
func (MenPai) Mixin() []ent.Mixin {
return []ent.Mixin{
TimeMixin{},
}
}
有著優秀歷史就不要藏著掖著,300年的岳陽門都能在江湖上叫字號,何況我們種花家呢。
江湖兒女
江湖兒女我就不贅述了,直接上程式碼:
package schema
import (
"github.com/facebookincubator/ent"
"github.com/facebookincubator/ent/schema/field"
)
// JiangHuRen holds the schema definition for the JiangHuRen entity.
type JiangHuRen struct {
ent.Schema
}
// Fields of the JiangHuRen.
func (JiangHuRen) Fields() []ent.Field {
return []ent.Field{
field.String("name").Unique().Comment("江湖名號一定要獨一無二"),
field.Uint("age").Comment("姑娘你芳齡幾何"),
}
}
// Edges of the JiangHuRen.
func (JiangHuRen) Edges() []ent.Edge {
return nil
}
func (JiangHuRen) Mixin() []ent.Mixin {
return []ent.Mixin{
TimeMixin{},
}
}
至此,江湖裡最重要的兩個元素就定義完了。當然還有武功,這個就不說了,大家都是大俠,不獻醜了。
生成程式碼
entc generate ./ent/schema
然後就發現,哇,江湖裡多了好多東西,然而這一切都只能算是甘妹江湖的構想。現在江湖是這樣的:
他們是什麼東東呢?且聽下回分解。
本作品採用《CC 協議》,轉載必須註明作者和本文連結