Tomo.Log()


[Vapor3] カスタムCommandの中でDBにアクセスする

[10/27, 2018]

日本語 / English

そもそも、Vapor3のCommand機能ってなんのためにあるのでしょうか?

個人的にまだ理解度があまりなくて、有益な使い方がわかっていないのですが、初期のAdminユーザーの作成とか、Vaporのプロジェクトに直接書き込みたくない初期設定をコマンドから行えるようにするのがいいのかなーと考えています。

Command内でDBにアクセスするには?

コマンドの実行は run の中で行われます。
CommandContextのもっているcontainerからwithNewConnectionを使って接続します。

以下のサンプルは、入力されたパラメータを元に、Adminユーザーを追加しています。

func run(using context: CommandContext) throws -> Future<Void> {

    let name = try context.argument("name")
    let email = try context.argument("email")
    let password = try context.argument("password")
    let hash = try BCrypt.hash(password)

    let container = context.container
    return container.withNewConnection(to: .mysql) {
            conn in            
            //conn <- DatabaseConnectableのオブジェクト
            let admin = User(name: name, email: email, passwordHash: hash)
            return [admin.create(on: conn)].flatten(on: container).transform(to: ())
    }
}

実際は、入力されたパラメータで既存のユーザが、いるかどうかなどを確かめた方がいいかなと思います。

Commandのソース全体はGithubにアップしてあります。Github