《甘十九妹》 ent 實現之 Schema 定義

碧落暉發表於2020-03-29

《西遊記》是我看過最多遍的小說,《甘十九妹》是我看過最多遍的電視劇,或許是我想學會孫悟空的神通廣大,然後去江湖裡挽救那個『不知何故落人間』的甘妹,那個說過『人生天地,如果能把持住是非曲直,敢愛敢恨,恩怨分明,就不愧人生天地一場。』的奇女子,那首二十餘年仍在腦海中徘徊的《如果來生還是今世的重複》。

最近在無意中看到了 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 協議》,轉載必須註明作者和本文連結

摺扇輕合書已竟,入戲太深我共卿。

相關文章