AdonisJSでデータベース接続設定
AdonisJSでデータベース接続設定
2022/10/29

こちらは、現時点で最新のAdonisJS v5の記事になります。

AdonisJSでデータベースへの接続設定の紹介と旧AdonisJS v4から移行する際の修正箇所を紹介。

公式リファレンス
https://docs.adonisjs.com/guides/database/introduction

Lucidパッケージと設定の追加

DB接続に必要なAdonisのパッケージを追加と設定ファイルを生成します。

$ yarn @adonisjs/lucid
$ node ace configure @adonisjs/lucid

DB接続情報の環境変数を追加

export default Env.rules({
  DB_HOST: Env.schema.string({ format: 'host' }),
  DB_PORT: Env.schema.number(),
  DB_USER: Env.schema.string(),
  DB_PASSWORD: Env.schema.string.optional(),
  DB_DATABASE: Env.schema.string(),
})
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_USER=adonis
DB_PASSWORD=adonis
DB_DATABASE=adonis

DB接続設定の変更

初期ではPostgreSQLのpg設定しかないので、MySQLの設定に変更する。

connections: {
-    pg: {
-      client: 'pg',
+    mysql: {
+      client: 'mysql2',
       connection: {
-        host: Env.get('PG_HOST'),
-        port: Env.get('PG_PORT'),
-        user: Env.get('PG_USER'),
-        password: Env.get('PG_PASSWORD', ''),
-        database: Env.get('PG_DB_NAME'),
+        host: Env.get('DB_HOST'),
+        port: Env.get('DB_PORT'),
+        user: Env.get('DB_USER'),
+        password: Env.get('DB_PASSWORD', ''),
+        database: Env.get('DB_DATABASE'),
       },

clientにmysql2をつかっているので、Packageをインストール

$ yarn add mysql2

HealthCheckで接続できているか確認

AdonisJSにHealthCheckという設定に問題がないかを確認できる機能があるので、それを使ってDB接続できているか確認する。

if (Env.get('NODE_ENV') !== 'production') {
  Route.get('health', async ({ response }) => {
    const report = await HealthCheck.getReport()

    response.type('.json')

    return report.healthy
      ? response.ok(report)
      : response.badRequest(report)
  })
}
mysql: {
  healthCheck: true,
}

http://127.0.0.1:8080/healthにアクセスすると、以下のように情報が表示される。

接続失敗例

{
    "healthy": false,
    "report": {
        "lucid": {
            "displayName": "Database",
            "health": {
                "healthy": false,
                "message": "One or more connections are not healthy"
            },
            "meta": [
                {
                    "connection": "mysql",
                    "message": "Unable to reach the database server",
                    "error": {
                        "errno": -3008,
                        "code": "ENOTFOUND",
                        "syscall": "getaddrinfo",
                        "hostname": "mysql",
                        "fatal": true
                    }
                }
            ]
        }
    }
}

環境変数が間違っていたので修正して、再度確認したら解決。
.envを変更したら自動で再起動してくれるの便利

接続成功例

{
    "healthy": true,
    "report": {
        "lucid": {
            "displayName": "Database",
            "health": {
                "healthy": true,
                "message": "All connections are healthy"
            },
            "meta": [
                {
                    "connection": "mysql",
                    "message": "Connection is healthy",
                    "error": null
                }
            ]
        }
    }
}

Migrationファイルを移す

database/migrations/以下にあるmigrationファイルを移していく。

ファイルをコピペ
TypeScriptに書き直す必要があるので、拡張子をjs→tsに書き換える。

旧migrationファイル

KnexのSchemaBuilderの書き方はほぼ変わってなかった。

-'use strict'
+import BaseSchema from '@ioc:Adonis/Lucid/Schema'
 
-/** @type {import('@adonisjs/lucid/src/Schema')} */
-const Schema = use('Schema')
+export default class UserSchema extends BaseSchema {
+  protected tableName = 'users'
 
-class UserSchema extends Schema {
-  up() {
-    this.createIfNotExists('users', (table) => {
+  public async up() {
+    this.schema.createTableIfNotExists(this.tableName, (table) => {
       table.increments()
       table.string('email', 254).notNullable().unique()
       table.string('password', 60).notNullable()
@@ -13,9 +12,7 @@ class UserSchema extends Schema {
     })
   }
 
-  down() {
-    this.dropIfExists('users')
+  public async down() {
+    this.schema.dropTableIfExists(this.tableName)
   }
 }
-
-module.exports = UserSchema

変わってた部分

// ❌
table.unique('email')
// ✅
table.unique(['email'])

Migrationステータスを修正していく

現状のmigrationステータスを確認するとpendingになっており、マイグレーションが正常な状態でないことがわかる。

$ node ace migration:status

マイグレーションが正常な状態でない

Adonis v4ではDBに1503250034279_userで保存されており、v5ではdatabase/migrations/1503250034279_userのようにディレクトリ名も含めて保存されるようになったため。

ディレクトリ名も含めて保存されるようになった

この差を更新するSQLを実行して、DBを更新する

UPDATE adonis_schema
SET name = CONCAT('database/migrations/', name);

再度Migrationステータスを確認するとcompletedになった。

$ node ace migration:status

Migrationステータスを確認するとcompletedになった

Migrationファイルの移行完了。

以上にて、Adonisでデータベースに接続作業完了。

AdonisJS v5へのアップグレードが大変だったのでこちらにまとめました。