项目创建

本指南针对的是首次需要说明如何从零开始创建项目的用户。 在我们开始之前,请确保您的机器上满足了以下前提条件。

前提条件

在安装这些依赖后,创建项目目录并初始化Go模块:

  1. mkdir todo
  2. cd $_
  3. go mod init todo

安装

运行以下的 Go 命令来安装 Ent,初始化带有一个 Todo 结构(Schema) 的项目。

  1. go get entgo.io/ent/cmd/ent
  1. go run entgo.io/ent/cmd/ent init Todo

在安装 Ent 并运行 ent init之后,你的项目目录类似如下:

  1. .
  2. ├── ent
  3. ├── generate.go
  4. └── schema
  5. └── todo.go
  6. ├── go.mod
  7. └── go.sum

ent 目录包含生成的资源(见下一节), ent/schema 目录包含你的实体结构。

代码生成

当我们运行上面的ent init Todo时,在todo/ent/schema/目录下的todo.go文件中创建了一个名为Todo的Schema。

  1. package schema
  2. import "entgo.io/ent"
  3. // Todo holds the schema definition for the Todo entity.
  4. type Todo struct {
  5. ent.Schema
  6. }
  7. // Fields of the Todo.
  8. func (Todo) Fields() []ent.Field {
  9. return nil
  10. }
  11. // Edges of the Todo.
  12. func (Todo) Edges() []ent.Edge {
  13. return nil
  14. }

如你所见,初始的Schema没有定义任何字段和边。 让我们运行生成资源的命令,以便与 Todo 实体交互:

  1. go generate ./ent

创建测试案例

运行go generate ./ent调用了Ent的自动代码生成工具,它使用我们在schema包中定义的Schema来生成实际的Go代码,我们现在将使用这些代码与数据库进行交互。 在这个阶段,您可以在./ent/client.go下找到能够查询和更变Todo实体的客户端代码。 让我们创建一个 可测试的例子来使用它。 在这个测试案例中,我们将使用 SQLite 来测试Ent。

  1. go get github.com/mattn/go-sqlite3
  2. touch example_test.go

example_test.go中粘贴以下代码,实例化一个ent.Client并自动创建数据库中的所有Schema的相关资源 (数据表、列等)。

  1. package todo
  2. import (
  3. "context"
  4. "log"
  5. "todo/ent"
  6. "entgo.io/ent/dialect"
  7. _ "github.com/mattn/go-sqlite3"
  8. )
  9. func Example_Todo() {
  10. // 使用内存中SQLite数据库来创建 ent.Client
  11. client, err := ent.Open(dialect.SQLite, "file:ent?mode=memory&cache=shared&_fk=1")
  12. if err != nil {
  13. log.Fatalf("failed opening connection to sqlite: %v", err)
  14. }
  15. defer client.Close()
  16. ctx := context.Background()
  17. // 运行自动迁移工具来创建所有Schema资源
  18. if err := client.Schema.Create(ctx); err != nil {
  19. log.Fatalf("failed creating schema resources: %v", err)
  20. }
  21. // 输出:
  22. }

然后,运行go test来验证一切工作是否符合预期。

  1. go test

设置好项目后,我们就可以创建我们的Todo列表了。