0Pricing
JavaScript Academy · レッスン

バージョン管理とアップグレード

バージョン変更に合わせてスキーマを移行します。

「バージョン管理とアップグレード」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。

なぜバージョン管理を行うのか

アプリは進化します。ストアやインデックスを追加したり、データの構造を変更したりします。IndexedDBではバージョン番号を使って、すべてのユーザーのブラウザーでスキーマの変更を安全に管理します。

バージョン番号

openの2番目の引数は、正の整数であるバージョンです。これを大きくすると、ブラウザーにスキーマが変更されたことを伝え、アップグレードを開始します。

// Bumping from 1 to 2 triggers onupgradeneeded:
const request = indexedDB.open('app-db', 2);

アップグレードは増加のみ

バージョンは増加させることしかできません。保存されているバージョンより小さい番号で開くと、エラーが発生して失敗します。決して減少させないでください。

// If the stored DB is version 3:
const req = indexedDB.open('app-db', 2);
req.onerror = () => console.log('cannot open older version');

oldVersionとnewVersion

onupgradeneeded内では、イベントからoldVersionとnewVersionを取得できます。これらを使って、まだ実行されていないマイグレーションだけを適用します。

request.onupgradeneeded = (e) => {
  console.log('upgrading from', e.oldVersion, 'to', e.newVersion);
};

段階的なマイグレーション

堅牢なパターンは、oldVersionを使ったフォールスルーです。各ブロックが前のブロックの変更を引き継ぐため、どの古いバージョンのユーザーでも最新のスキーマに到達できます。

request.onupgradeneeded = (e) => {
  const db = e.target.result;
  if (e.oldVersion < 1) {
    db.createObjectStore('notes', { keyPath: 'id' });
  }
  if (e.oldVersion < 2) {
    db.createObjectStore('tags', { keyPath: 'name' });
  }
};

後からインデックスを追加する

アップグレード中に既存のストアへインデックスを追加するには、アップグレード用トランザクションからストアを取得し、そのストアでcreateIndexを呼び出します。

request.onupgradeneeded = (e) => {
  if (e.oldVersion < 3) {
    const store = e.target.transaction.objectStore('notes');
    store.createIndex('byDate', 'createdAt');
  }
};

バージョン変更トランザクション

onupgradeneeded中のイベントのtransactionは、特殊なversionchangeトランザクションです。スキーマの変更とデータのマイグレーションの両方を実行できるのは、このコンテキストだけです。

request.onupgradeneeded = (e) => {
  const tx = e.target.transaction; // versionchange tx
  const store = tx.objectStore('notes');
  // migrate existing records here if needed
};

既存データのマイグレーション

スキーマの変更にレコードの構造変更が必要な場合は、アップグレード中にカーソルでストアを反復処理し、変換した値をputで書き戻します。

const store = e.target.transaction.objectStore('notes');
store.openCursor().onsuccess = (ev) => {
  const cursor = ev.target.result;
  if (cursor) {
    const note = cursor.value;
    note.archived = false; // new field
    cursor.update(note);
    cursor.continue();
  }
};

versionchangeイベント

あるタブがアップグレードすると、古いバージョンを保持しているほかのタブでは、dbに対してversionchangeイベントが発生します。アップグレードがブロックされないように、これらのタブは接続を閉じる必要があります。

db.onversionchange = () => {
  db.close(); // let the other tab upgrade
  console.log('database is outdated, please reload');
};

ストアの削除

アップグレード中にdb.deleteObjectStore(name)を使うと、不要になったストアを削除できます。ストアとそのデータは完全に削除されます。

request.onupgradeneeded = (e) => {
  const db = e.target.result;
  if (e.oldVersion < 4 && db.objectStoreNames.contains('temp')) {
    db.deleteObjectStore('temp');
  }
};

アップグレードのベストプラクティス

マイグレーションはべき等にし、oldVersionの順序に従って実行します。versionchangeでは古い接続を閉じ、過去のすべてのバージョンからのアップグレードをテストしてください。これにより、既存ユーザーのデータを維持できます。

理解度チェック

バージョン管理とアップグレードについての理解度を確認しましょう。

まとめ

バージョン管理とアップグレードについて学びました。

  • バージョン番号を上げてonupgradeneededを発生させます。
  • oldVersionを使って、段階的でべき等なマイグレーションを行います。
  • アップグレードのversionchangeトランザクションで、スキーマとデータを変更します。
  • カーソルとcursor.updateでレコードをマイグレーションします。
  • versionchangeイベントで古いタブを閉じます。

IndexedDBはこれで終了です。次は、Service Workerです。

よくある質問

「バージョン管理とアップグレード」レッスンは無料ですか?

はい。「バージョン管理とアップグレード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「バージョン管理とアップグレード」で何を学びますか?

バージョン変更に合わせてスキーマを移行します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「バージョン管理とアップグレード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データベースを開く
  2. トランザクションと CRUD
  3. インデックスとクエリ
  4. バージョン管理とアップグレード
← JavaScript Academyに戻る