Facebook 開源 Golang 實體框架 Ent 現已支持 TiDB

對於後端開發者來說,一款好用的框架能夠大大提升應用的開發效率。爲了降低開發者使用 TiDB 的門檻,方便開發者快速連接到 TiDB,我們也在和合作夥伴一起,逐步完善面向主流開發語言和框架的連接支持。

近日,Facebook 開源的 Golang 實體框架 Ent 完成了對 TiDB 數據庫的支持。 Ent 是一款易於構建和維護應用程序與大數據模型的框架。具有以下特點:

  • Schema 即代碼:能將任何數據庫表建模爲 Go 對象;
  • 輕鬆地遍歷任何圖形 :可以輕鬆地運行查詢、聚合和遍歷任何圖形結構;
  • 靜態類型和顯式 API:使用代碼生成靜態類型和顯式 API,查詢數據更加便捷;
  • 多存儲驅動程序:支持 MySQL、PostgreSQL、SQLite、Gremlin,現在也已經支持了 TiDB;
  • 可擴展:易於擴展和使用 Go 模板自定義。

下面通過一個 Hello World 的應用示例,來看下如何快速實現一個基於 Ent + TiDB 的應用。

Hello World 應用示例

1.用 Docker 在本地啓動一個 TiDB Server

docker run -p 4000:4000 pingcap/tidb

現在你應該有一個運行的 TiDB 實例,開放了 4000 端口監聽。

2.在本地拷貝 hello world 的示例 repo

git clone https://github.com/hedwigz/tidb-hello-world.git

在這個示例 repo 中我們定義了一個簡單的 User schema

go title="ent/schema/user.go"
 func (User) Fields() []ent.Field {
           return []ent.Field{
                  field.Time("created_at").
                          Default(time.Now),
                  field.String("name"),
                  field.Int("age"),
          }
 }

然後,連接 Ent 和 TiDB:

go title="main.go"
client, err := ent.Open("mysql", "root@tcp(localhost:4000)/test?parseTime=true")
if err != nil {
        log.Fatalf("failed opening connection to TiDB: %v", err)
}
defer client.Close()
// Run the auto migration tool, with Atlas.
if err := client.Schema.Create(context.Background(), schema.WithAtlas(true)); err != nil {
        log.Fatalf("failed printing schema changes: %v", err)
}

可以看到,在第一行我們通過一個 MySQL 語句去連接 TiDB Server,因爲 TiDB 是兼容 MySQL 的,所以不需要其他特殊的 driver。 話雖如此,TiDB 和 MySQL 還是有很多不同,尤其是與 Schema 遷移相關的操作,比如 SQL 診斷和遷移規劃。所以,Atlas 可以自動監測出是連接到 TiDB,做相應的遷移處理。 此外,第七行我們使用schema.WithAtlas(true),表示 Ent 是使用“Atlas”作爲遷移引擎。Atlas 是 Ent 剛剛發佈的遷移引擎,得益於 Atlas 的最新設計,對新數據庫的支持也變得前所未有的簡單。

最後,我們新建一條 user 數據,並保存到 TiDB 中,以用於後需的數據讀取和輸出。

go title="main.go"
client.User.Create().
               SetAge(30).
               SetName("hedwigz").
               SaveX(context.Background())
user := client.User.Query().FirstX(context.Background())
fmt.Printf("the user: %s is %d years old\n", user.Name, user.Age)

3.運行這個示例程序:

$ go run main.go  
the user: hedwigz is 30 years old

在這次快速演練中,我們成功實現了:

  • 啓動一個本地的 TiDB 實例;
  • 連接 Ent 和 TiDB 數據庫;
  • 使用 Atlas 遷移 Ent Schema;
  • 使用 Ent 從 TiDB 中插入和讀取數據。

版本說明

目前,這個示例應用在 Ent v0.10 和 TiDB v5.4.0 中可以正常運行,Ent 也計劃在未來繼續拓展對 TiDB 的支持。如果你使用其他版本的 TiDB 或者需要幫助,歡迎加入 asktug.com 來交流。如果你也有項目希望與 TiDB 適配,歡迎來 GitHub 提交 issue 。 除了 Ent,TiDB 此前已經添加了對 GORM 和 go-sql-driver/mysql 的支持,詳情可查看文檔: https://docs.pingcap.com/appdev/dev

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章