説明
概要
データベーススキーマに定義されたオブジェクトをdrop & createし、データをロードすることでデータベーススキーマのマイグレーションを行います。
このタスクを実行する前に、Gen-DdlタスクによってDDLファイルやダンプファイルが生成されていなければいけません。
処理の流れ
デフォルトの処理の流れを説明します。
Migrateタスクは、まず、現在のスキーマのバージョン番号をschemaInfoFullTableName属性に指定したテーブルから取得します(テーブルが存在しない場合は0になります)。 次に、移行先のバージョン番号をddlInfoFile属性に指定したテキストファイルから取得します(ファイルが存在しない場合は0になりますが、Gen-Ddlタスクを実行していれば存在するはずです)。 それから、現在のスキーマのバージョン番号に対応するディレクトリを選択し、その直下のdropディレクトリ以下にあるDDLファイルを実行します。 この処理により、古いオブジェクトが削除されます。 その後、移行先のバージョン番号に対応するディレクトリを選択し、その直下のcreateディレクトリ以下にあるDDLファイルの実行とダンプファイルのロードを行います。 この処理により、新しくオブジェクトが作成され、schemaInfoFullTableName属性に指定したテーブルに移行先のバージョン番号が格納されます。 また、ダンプファイルが存在する場合はデータがテーブルにロードされます。 以上で、マイグレーションが完了します。
マイグレーション後にダンプファイルを修正してデータをロードしなおしたい場合は、再度Migrateタスクを実行してください。 この場合、現在のスキーマのバージョン番号と移行先のバージョン番号が同じになりますが、実行される処理の流れはバージョン番号が異なる場合と同様です。 つまり、現在のスキーマのバージョン番号と移行先のバージョン番号が同じであれば、同じバージョンディレクトリ以下のdropディレクトとcreateディレクトリが処理されます。
ディレクトリとファイルの処理順序
dropディレクトリとcreateディレクトリどちらを対象にするにせよ、同じ階層に存在するファイルやディレクトリは名前で昇順にソートされ処理されます。 たとえば、dropディレクトリの直下に010-foreignkeyと030-uniquekeyの2つのディレクトリがある場合、010-foreignkey、030-uniquekeyの順番で処理されます。 しかし、もし、それら2つに加え020-sequenceというディレクトリがあれば、順番は、010-foreignkey、020-sequence、030-uniquekeyとなります。 Migrateタスクは、ディレクトリについてはその階層を下へ辿ります。ファイルについては拡張子に従って処理します。
- 拡張子がsqlもしくはddlの場合、データはSQLとみされデータベースに対し発行されます。
- 拡張子がcsvの場合、データはCSV形式のダンプファイルとみなされデータベースにロードされます。
- その他の拡張子を持つファイルについては、何の処理も行われません。
パラメータ
トップレベルのパラメータ
属性 | 説明 | デフォルト値 | 必須 |
---|---|---|---|
classpathDir | エンティティクラスを含むクラスパスのディレクトリです。このディレクトリはタスクの実行時のクラスパスに含まれている必要があります。 | - | YES |
rootPackageName | ルートパッケージ名です。 | "" | NO |
entityPackageName | エンティティクラスのパッケージ名です。エンティティクラスは、rootPackageNameとこの値をピリオドで連結したパッケージに配置されているとみなされます。 | "entity" | NO |
entityClassNamePattern | このタスクで対象とするエンティティクラス名の正規表現です。 | ".*" | NO |
ignoreEntityClassNamePattern | このタスクで対象としないエンティティクラス名の正規表現です。 | "" | NO |
schemaInfoFullTableName | スキーマのバージョンを管理するテーブル名です。 | "SCHEMA_INFO" | NO |
schemaInfoColumnName | スキーマのバージョンを管理するカラム名です。 | "VERSION" | NO |
migrateDir | マイグレーション用のファイルを管理するディレクトリです。 | "db/migrate" | NO |
ddlInfoFile | DDLのバージョン番号を管理するファイルです。 | "db/ddl-info.txt" | NO |
versionNoPattern | バージョン番号のパターンです。バージョン番号に対応するディレクトリ名に使用されます。 | "0000" | NO |
version | マイグレーション先のバージョンです。 | "latest" | NO |
statementDelimiter | SQLステートメントの区切り文字です。 | ";" | NO |
blockDelimiter | SQLブロックの区切り文字です。指定しない場合は、データベースのデフォルトの区切り文字が使用されます。たとえば、SQL Serverでは"go"、Oralce Databaseでは"/"、MySQLでは"/"、DB2では"@"が使用されます。 | - | NO |
ddlFileEncoding | DDLファイルのエンコーディングです。 | "UTF-8" | NO |
dumpFileEncoding | ダンプファイルのエンコーディングです。 | "UTF-8" | NO |
haltOnError | "true"の場合、スキーマを作成するSQLやデータのロードが失敗すると即座にエラーを返します。スキーマを削除する処理については、エラーが起きても処理を続行します。 | "true" | NO |
loadBatchSize | ダンプファイルのデータをロードする際のバッチサイズです。 | "10" | NO |
transactional | "true"の場合、単一のトランザクションとして実行します。 | "false" | NO |
genDialectClassName | S2JDBC-Genのダイアレクトインタフェースの実装クラス名です。ここに指定するクラスはorg.seasar.extension.jdbc.gen.dialect.GenDialectインタフェースを実装している必要があります。指定しない場合はS2JDBCのダイアレクト に対応したデフォルトのクラスが使用されます。 | - | NO |
configPath | JdbcManagerのコンポーネント定義を含む設定ファイルです。 | "s2jdbc.dicon" | NO |
env | 環境名です。 | "ut" | NO |
applyEnvToVersion | バージョンディレクトリに環境名を適用する場合"true"を指定します。trueを指定すると、通常のバージョンディレクトリよりも環境名つきバージョンディレクトリに存在するダンプファイルを優先してロードします。 | "false" | NO |
jdbcManagerName | JdbcManagerのコンポーネント名です。接続先のデータベースはJdbcManagerのコンポーネント名によって決まります。 | "jdbcManager" | NO |
factoryClassName | S2JDBC-Genの公開されたインタフェースの実装を作成するファクトリのクラス名です。S2JDBC-Genをカスタマイズする場合に独自のファクトリクラスを指定できます。ここに指定するクラスはorg.seasar.extension.jdbc.gen.internal.factory.Factoryインタフェースを実装している必要があります。 | "org.seasar.extension.jdbc.gen .internal.factory.FactoryImpl" |
NO |
commandInvokerClassName | S2JDBC-Genのコマンドを呼び出すクラスの名前です。コマンドの呼び出し前後で任意の処理を実行したい場合に指定します。ここに指定するクラスはorg.seasar.extension.jdbc.gen.command.CommandInvokerインタフェースを実装している必要があります。 | "org.seasar.extension.jdbc.gen .internal.command.CommandInvokerImpl" |
NO |
classpath | このタスクを実行する際のクラスパスです。 | - | classpathrefが指定されていない場合YES |
classpathref | このタスクを実行する際のクラスパスの参照です。 | - | classpathが指定されていない場合YES |
例
マイグレーション先のバージョン番号を指定する
デフォルトでは、マイグレーション先のバージョン番号は最新の番号、つまりddlInfoFile属性に指定されたテキストファイルで管理する番号になります。 最新のバージョン番号ではなく、任意のバージョン番号を指定するには、version属性を使用します。 次の例では、マイグレーション先のバージョン番号に15を指定しています。
<migrate rootpackagename="examples" version="15" classpathref="classpath" />
バージョン番号に対応するバージョンディレクトリはあらかじめ存在していなければいけません。 version属性には、バージョンディレクトリ名ではなくバージョン番号を指定することに注意してください。