こちらは、現時点で最新の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に書き換える。
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ファイルの移行完了。
以上にて、Adonisでデータベースに接続作業完了。