Bun 入门套件

Bun 入门套件在新窗口中打开 包含

您还可以查看 bun-realworld-app在新窗口中打开,它是一个使用 Bun 入门套件构建的 JSON API。

应用程序结构

入门套件具有以下结构

├─ bunapp
│  └─ app.go
│  └─ config.go
│  └─ router.go
│  └─ start.go
│  └─ hook.go
│  └─ embed
│     └─ config
│        └─ dev.yaml
│        └─ test.yaml
├─ cmd
│  └─ bun
│     └─ main.go
│     └─ migrations
│        └─ main.go
│        └─ 20210505110026_init.go
├─ example
│  └─ init.go
│  └─ example_handler.go
│  └─ example_handler_test.go
├─ .gitignore
└─ go.mod

主要入口点是

  • bunapp/app.go 包含 App 结构,该结构维护应用程序状态。例如,App.DB() 创建 *bun.DB
  • bunapp/config.go 包含 Config 结构,用于解析 YAML 配置,例如 bunapp/embed/config/dev.yaml
  • cmd/bun/migrations 包含数据库迁移。
  • example/init.go 是包入口点。

您应该将 HTTP 处理程序和 DB 模型保存在同一个包中,但将应用程序拆分为逻辑上隔离的包。每个包都应该有一个 init.go 文件,其中包含模块初始化逻辑。

启动应用程序

该套件提供了方便的方法来启动/停止应用程序

func main() {
	ctx, app, err := bunapp.Start(ctx, "service_name", "environment_name")
	if err != nil {
		panic(err)
	}
	defer app.Stop()
}

它还提供了钩子,用于在应用程序启动/停止时执行自定义代码。您通常从模块的 init.go 文件中的 init 函数添加钩子。

func init() {
	bunapp.OnStart("hook.name", func(ctx context.Context, app *bunapp.App) error {
		app.Router().GET("/endpoint", handler)

		app.OnStop("hook.name", func(ctx context.Context, app *bunapp.App) error {
			log.Println("stopping...")
		})

		return nil
	})
}

迁移

该套件还提供了一个 CLI 来管理迁移

go run cmd/bun/main.go

NAME:
   bun db - manage database migrations

USAGE:
   bun db [global options] command [command options] [arguments...]

COMMANDS:
   init        create migration tables
   migrate     migrate database
   rollback    rollback the last migration group
   unlock      unlock migrations
   create_go   create a Go migration
   create_sql  create a SQL migration
   help, h     Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h  show help (default: false)