ent.go 说 sql: 数据库在任何查询中都关闭

ent.go saying sql: databse is closed on any query

db/db.go

    func DbClient(cfg *config.Config, logger log.Logger) *ent.Client {
    // "host=<host> port=<port> user=<user> dbname=<database> password=<pass>"
    psqlInfo := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s",
        cfg.DB_HOST, cfg.DB_PORT, cfg.DB_USER, cfg.DB_NAME, cfg.DB_PASS)
    client, err := ent.Open("postgres", psqlInfo)
    if err != nil {
        logger.Fatal(err)
    }
    defer client.Close()
    logger.Info("Database Connected")
    if err := client.Schema.Create(context.Background()); !errors.Is(err, nil) {
        logger.Fatalf("Error: failed creating schema resources %v\n", err)
    }

    return client
}

services/userservice.go

func CreateUser(client *ent.Client, input *model.NewUser) (*ent.User, error) {
    user, err := client.Debug().User.Create().SetName(input.Name).SetUsername(input.Username).SetEmail(input.Email).SetPassword(input.Password).Save(context.Background())
    if err != nil {
        return &ent.User{}, err
    }
    return user, nil
}

ent 客户端正在创建所有必要的表并显示数据库已连接。 但是当我执行 CreateUser() 时,它返回 sql: database is closed。谁能告诉我为什么会这样?

在您的 bootstrap 代码中有一个数据库连接 Close 调用:

func DbClient(cfg *config.Config, logger log.Logger) *ent.Client {
  // "host=<host> port=<port> user=<user> dbname=<database> password=<pass>"
  psqlInfo := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s",
cfg.DB_HOST, cfg.DB_PORT, cfg.DB_USER, cfg.DB_NAME, cfg.DB_PASS)
  client, err := ent.Open("postgres", psqlInfo)
  if err != nil {
      logger.Fatal(err)
  }
  defer client.Close() // <- this one
  logger.Info("Database Connected")
  if err := client.Schema.Create(context.Background()); !errors.Is(err, nil) {
    logger.Fatalf("Error: failed creating schema resources %v\n", err)
  }
  return client
}

返回后调用关闭连接client。 如果需要关闭连接,请从 CreateUser() 函数中将其关闭。

func CreateUser(client *ent.Client, input *model.NewUser) (*ent.User, error) {
    user, err := client.Debug().User.Create().SetName(input.Name).SetUsername(input.Username).SetEmail(input.Email).SetPassword(input.Password).Save(context.Background())
    if err != nil {
        return &ent.User{}, err
    }
    defer client.Close() // <- here
    return user, nil
}