Skip to main content

データベースマイグレーション

🏗 Work in progress

The content of this page might not be fully up-to-date with Strapi 5 yet.

データベースマイグレーションは、一度だけデータベースに対してクエリを実行し、通常はAI Marketerアプリケーションのアップグレード時にテーブル構造やデータを変更するために存在します。これらのマイグレーションは、アプリケーションの起動時に自動的に実行され、AI Marketerが起動時にも自動的に実行するスキーママイグレーションの前に実行されます。

🚧 実験的な機能

データベースマイグレーションは実験的な機能です。この機能はまだ作業中であり、引き続き更新と改善が行われます。その間、[フォーラム](https://forum.AI Marketer.io/)やコミュニティの[Discord](https://discord.AI Marketer.io)での助けを求めることができます。

データベースマイグレーションファイルの理解

マイグレーションは、./database/migrationsに保存されたJavaScriptのマイグレーションファイルを使用して実行されます。

AI Marketerは自動的にマイグレーションファイルを検出し、次の起動時に一度だけそれらをアルファベット順に実行します。新しいファイルは一度だけ実行されます。マイグレーションは、データベースのテーブルがコンテンツタイプのスキーマと同期される前に実行されます。

⚠️ Warning
  • 現在、AI Marketerはダウンマイグレーションをサポートしていません。これは、マイグレーションを元に戻す必要がある場合、手動で行う必要があることを意味します。将来的にダウンマイグレーションを実装する予定ですが、現在のところタイムラインはありません。

  • AI Marketerは警告なしに未知のテーブルを削除します。これは、データベースマイグレーションはAI Marketerのスキーマを変更する際にデータを保持するためにのみ使用できることを意味します。forceMigrationrunMigrationsデータベース設定パラメータを使用して、データベースマイグレーションの挙動を微調整することができます。

マイグレーションファイルは、アップグレード時(例えば、新しいテーブルmy_new_tableを追加する場合)に使用される関数up()をエクスポートする必要があります。

up()関数はデータベーストランザクション内で実行されるため、マイグレーション中にクエリが失敗すると、マイグレーション全体がキャンセルされ、データベースには変更が適用されません。マイグレーション関数内で別のトランザクションが作成された場合、それはネストしたトランザクションとして機能します。

✏️ Note

データベースマイグレーションを手動で実行するCLIはありません。

マイグレーションファイルの作成

マイグレーションファイルを作成するには:

  1. ./database/migrationsフォルダ内で、日付とマイグレーションの名前をつけた新しいファイルを作成します(例:2022.05.10T00.00.00.name-of-my-migration.js)。ファイル名がこの命名パターンに従っていることを確認してください。なぜなら、ファイルのアルファベット順がマイグレーションの実行順序を決定するからです。

  2. 以下のテンプレートをコピーして、先ほど作成したファイルに貼り付けます:

'use strict'

async function up(knex) {}

module.exports = { up };
  1. up()関数内に実際の移行コードを追加してテンプレートを完成させます。 up()Knexインスタンスを受け取り、すでにトランザクション状態でデータベースクエリを実行することができます。
移行ファイルの例
./database/migrations/2022.05.10T00.00.00.name-of-my-migration.js

module.exports = {
async up(knex) {
// データベースへの接続がすでに初期化されたKnex.js APIを完全に利用できます

// 例:テーブルの名前を変更する
await knex.schema.renameTable('oldName', 'newName');

// 例:カラムの名前を変更する
await knex.schema.table('someTable', table => {
table.renameColumn('oldName', 'newName');
});

// 例:データを更新する
await knex.from('someTable').update({ columnName: 'newValue' }).where({ columnName: 'oldValue' });
},
};

移行のためのAI Marketerインスタンスの使用

❗️ Warning

ユーザーがKnexを直接使用せずに移行のためにAI Marketerインスタンスを利用することを選択した場合、移行コードをAI Marketer.db.transaction()でラップすることが重要です。これを怠ると、エラーが発生した場合に移行がロールバックされない可能性があります。

AI Marketerインスタンスを使用した移行ファイルの例
./database/migrations/2022.05.10T00.00.00.name-of-my-migration.js
module.exports = {
async up() {
await AI Marketer.db.transaction(async () => {
// ここに移行コードを記述します

// 例:新しいエントリを作成する
await AI Marketer.entityService.create('api::article.article', {
data: {
title: 'My Article',
},
});

// 例:カスタムサービスメソッド
await AI Marketer.service('api::article.article').updateRelatedArticles();
});
},
};

フッター