コンテンツにスキップ

Environment Diff

Environment Diff機能を使用すると、2つの環境のデータベーススキーマを並べて比較できます。ブランチを親にマージする前にどのスキーマ変更が行われたかを理解したり、任意の2つの環境間の構造的差異を監査したりするのに便利です。

環境スキーマdiff比較


比較エンジンは、3つの段階で環境間の構造的差異を特定します:

  1. スキーマ分析: システムはソースとターゲットの両方の環境をイントロスペクトし、テーブル、列、インデックス、制約、リレーションを含む完全な構造を理解します。
  2. 比較: 2つの構造は以下で説明する前方のみセマンティクスに従って比較されます。エンジンは、ソース環境からの変更のうちターゲットに欠けているものを正確に特定します。
  3. マイグレーション生成: 検出された各変更について、システムはその変更をターゲット環境に安全に適用するために必要な対応するSQLコマンドを自動的に生成します。

Diffエンジンは前方のみセマンティクスを使用します。これは次のことを意味します:

  • ソースに存在しターゲットに存在しないオブジェクトCREATEDとして表示(ターゲットで作成する必要がある)
  • 両方に存在するオブジェクト → フィールドごとに比較され、差異は変更として表示
  • ターゲットにのみ存在するオブジェクトDROPPEDとして表示されない

これは重要な設計上の決定です。テーブルがターゲット環境にのみ存在する場合、ソースには存在しませんでした。TABLE_DROPPEDとして表示するのは誤解を招くでしょう。ソースで削除操作は実行されていなかったためです。Diffは、ソースで発生しターゲットに伝播する必要がある変更にのみ焦点を当てます。

例外: 両方の環境に存在するテーブル内の列レベルの変更では、COLUMN_DROPPEDは検出されます。ソースで実行された実際の列削除操作を表すためです。


Diffエンジンは以下のスキーマ変更カテゴリを検出します:

変更タイプ説明Breaking
TABLE_CREATEDテーブルがソースに存在しターゲットに存在しないいいえ
COLUMN_ADDEDソースのテーブルに新しい列が追加されたいいえ
COLUMN_DROPPED列がターゲットに存在するがソースで削除されたはい
COLUMN_TYPE_CHANGED列のデータ型が変更された場合による*
COLUMN_NULLABLE_CHANGED列のnullable制約が切り替えられた場合による
COLUMN_DEFAULT_CHANGED列のデフォルト値が変更されたいいえ
INDEX_CREATED新しいインデックスが追加されたいいえ
INDEX_DROPPEDインデックスが削除されたいいえ
ENUM_CREATED新しい列挙型がソースに存在しターゲットに存在しないいいえ
ENUM_VALUE_ADDED列挙型に新しい値が追加されたいいえ
ENUM_VALUE_REMOVED列挙型から値が削除されたはい
VIEW_CREATEDビューがソースに存在しターゲットに存在しないいいえ
VIEW_MODIFIEDビューのSQL定義が変更されたいいえ
RELATIONSHIP_ADDED新しい外部キーリレーションが追加されたいいえ
RELATIONSHIP_DROPPED外部キーリレーションが削除されたはい

* 型の狭小化(例:textvarchar(50)またはint8int4)はデータ損失を引き起こす可能性があるためbreakingとして分類されます。型の拡大(例:varchartext)は安全として分類されます。

注: トップレベルのTABLE_DROPPEDENUM_DROPPEDVIEW_DROPPEDは前方のみdiffでは生成されません。ターゲットにのみ存在するオブジェクトは、ソースの観点から「削除された」とは見なされません。


Diffビューは選択的変更適用をサポートしています。ユーザーは:

  • チェックボックスを使用して個々の変更を選択または選択解除できます
  • グループチェックボックスを使用してグループ内のすべての変更(例:特定のテーブルのすべての変更)を選択または選択解除できます
  • Breaking(破壊的)変更はデフォルトでは事前選択されていません — ユーザーは明示的にオプトインする必要があります

選択された変更のみがマージ適用時に含まれます。


query EnvironmentDiff($input: EnvironmentDiffInput!) {
environmentDiff(input: $input) {
success
message
changes {
changeType
objectType
objectName
fieldName
oldValue
newValue
isBreaking
sql
}
summary {
totalChanges
breakingChanges
addedTables
droppedTables
modifiedTables
}
}
}

Variables:

{
"input": {
"projectId": "f7e4a264-d659-4719-91e8-c2d74654e529",
"sourceEnvironment": "master",
"targetEnvironment": "staging"
}
}

changes配列の各エントリは、以下のフィールドを持つ単一のスキーマ変更を表します:

  • changeType: 上記の変更タイプ識別子のいずれか。
  • objectType: 影響を受けるデータベースオブジェクトの種類(tablecolumnindexenumviewrelationship)。
  • objectName: 影響を受けるオブジェクトの名前(例:テーブル名)。
  • fieldName: 列レベルの変更の場合、特定の列の名前。
  • oldValue / newValue: 変更の前後の値(例:"varchar(255)""text")。
  • isBreaking: この変更がデータ損失やAPI破損を引き起こす可能性があるかどうかを示すブール値。
  • sql: この変更を適用するために生成されたDDL文。