web-dev-qa-db-ja.com

具体的な例であるリキベースの操作方法

liquibase のクイックスタートに従って、チェンジセットを作成しました(非常に愚かです:))

コード:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd">

    <changeSet id="1" author="me">
        <createTable tableName="first_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createTable tableName="new_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

クリーンなスキーマを作成し、migrateコマンドを起動しました。

Liquibaseは、サポートテーブルdatabasechangelogと..lockを使用してデータベースを作成しました。

どうすれば変更を追跡できますか?新しいcreateTable要素を追加して変更セットを変更しましたが、「update」コマンドを実行すると、liquibaseはこれを教えてくれます

Migration Failed: Validation Failed:
     1 change sets check sum

だから私はリキベースを扱う方法を理解していないと思います。

誰かが私を正しい方向に向けるかもしれませんか?

ありがとう

32
apelliciari

すでに実行された<changeSet>は絶対に変更しないでください。 Liquibaseは、実行されたすべての変更セットのチェックサムを計算し、ログに保存します。次に、そのチェックサムを再計算し、保存されているチェックサムと比較し、チェックサムが異なる場合は次回実行時に失敗します。

代わりにanother<changeSet>を追加して、新しいcreateTable要素を追加する必要があります。

QuickStartは読みやすいですが、実際には迅速です:-)完全な manual 、特にその ChangeSet セクションを確認してください。

39
ChssPly76

この現在受け入れられている回答は、Liquibase 2.xでの変更に基づいて少し古くなっています。 2.xバージョンでは、変更セットのmd5チェックサムが変更されてもLiquibaseは失敗しますが、必要に応じてrunOnChange属性を指定できますそれを修正することができます。

ドキュメント から:

runOnChange-変更が初めて表示されたとき、および変更セットが変更されるたびに変更を実行します

27
Javid Jamae

基本的に既に行われている変更セットへの変更の場合は、データベースを手動で変更して、その変更セットのmd5が新しいデータベースと一致するようにすることができます。小さなテキストの変更に適しています。または、テーブルからそのチェンジセット行を削除することもできます。

3
rogerdpack