SQLite のエラー処理

SQLiteSQLiteBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに (Introduction)

この実験 (lab) では、SQLite データベースで効果的にエラーを処理する方法を学びます。主な焦点は、ON CONFLICT 句を使用して INSERT 操作中の制約違反を管理することです。

まず、データベースと UNIQUE 制約を持つテーブルを作成します。次に、競合が発生した場合に実行できるさまざまなアクション(ROLLBACKABORTFAILIGNORE、または REPLACE など)を検討します。特に、ON CONFLICT IGNORE を使用して、一意性制約に違反した場合の挿入を防ぎます。この実験 (lab) では、データの挿入と潜在的なエラーの処理に関する実践的な例を通して説明します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/init_db("Create SQLite Database") sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_row("Insert Single Row") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/start_trans("Begin New Transaction") sqlite/SQLiteGroup -.-> sqlite/undo_trans("Rollback Transaction") subgraph Lab Skills sqlite/init_db -.-> lab-552550{{"SQLite のエラー処理"}} sqlite/make_table -.-> lab-552550{{"SQLite のエラー処理"}} sqlite/add_row -.-> lab-552550{{"SQLite のエラー処理"}} sqlite/add_rows -.-> lab-552550{{"SQLite のエラー処理"}} sqlite/start_trans -.-> lab-552550{{"SQLite のエラー処理"}} sqlite/undo_trans -.-> lab-552550{{"SQLite のエラー処理"}} end

SQLite データベースと UNIQUE 制約を持つテーブルの作成 (Create a SQLite Database and Table with a UNIQUE Constraint)

このステップでは、SQLite データベースと UNIQUE 制約を持つテーブルを作成します。この制約は、重複したデータを挿入する際のエラー処理方法を理解するのに役立ちます。

まず、LabEx VM でターミナルを開きます。デフォルトのパスは /home/labex/project です。

次に、my_database.db という名前の SQLite データベースを作成しましょう。次のコマンドを実行して、データベースファイルを作成し、SQLite コマンドラインツールを開きます。

sqlite3 my_database.db

SQLite シェル内に入ったことを示すプロンプトが表示されます。

SQLite version 3.x.x
Enter ".help" for usage hints.
sqlite>

次に、ユーザー情報を格納するための users という名前のテーブルを作成します。このテーブルには、idusername、および email の 3 つの列があります。username 列には UNIQUE 制約があり、各ユーザー名はテーブル内で一意である必要があります。sqlite> プロンプトで次の SQL コマンドを入力し、Enter キーを押します。

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    email TEXT NOT NULL
);

このコマンドは、users テーブルを次のように設定します。

  • id は、新しいエントリごとに自動的に増加する整数です。PRIMARY KEY 制約により、各 id が一意であることが保証され、AUTOINCREMENT により自動的に増加します。
  • username は、空にすることができず (NOT NULL)、一意である必要があるテキストフィールドです (UNIQUE)。
  • email も、空にすることができないテキストフィールドです (NOT NULL)。

コマンドが正常に実行された場合、出力は表示されません。

テーブルへのデータの挿入 (Insert Data into the Table)

users テーブルを作成したので、いくつかのデータを追加してみましょう。ユーザーレコードをテーブルに挿入します。

sqlite> プロンプトで次のコマンドを実行して、ユーザーレコードを users テーブルに挿入します。

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

このコマンドは、users テーブルに行を追加します。

  • INSERT INTO users (username, email) は、users テーブルの username 列と email 列にデータを挿入することを指定します。
  • VALUES ('Alice', '[email protected]') は、各レコードに挿入される値を提供します。

データが正しく追加されたことを確認するには、次のコマンドを実行して、テーブル内のすべてのレコードを表示します。

SELECT * FROM users;

期待される出力 (Expected Output):

1|Alice|[email protected]

この出力は、レコードの idusername、および email を示しています。SELECT * コマンドは、指定されたテーブルからすべての列を取得します。

重複データの挿入の試み (Attempt to Insert Duplicate Data)

このステップでは、重複したユーザー名を持つレコードを挿入しようとします。これにより、UNIQUE 制約に違反し、エラーが発生します。

sqlite> プロンプトで次のコマンドを実行します。

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

次のようなエラーメッセージが表示されます。

Error: UNIQUE constraint failed: users.username

このエラーメッセージは、username 列の UNIQUE 制約に違反したことを示しています。SQLite は、データの整合性を維持するために、重複したユーザー名の挿入を防ぎます。

制約違反を処理するために ON CONFLICT IGNORE を使用する (Use ON CONFLICT IGNORE to Handle Constraint Violations)

このステップでは、ON CONFLICT IGNORE 句を使用して制約違反を処理する方法を学びます。この句は、制約に違反する場合、SQLite に挿入を無視するように指示します。

sqlite> プロンプトで次のコマンドを実行します。

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', '[email protected]');

このコマンドは、ユーザー名 'Alice' を持つ新しいレコードを挿入しようとします。ただし、ON CONFLICT IGNORE 句が使用されているため、SQLite は挿入を無視し、エラーは発生しません。

重複レコードが挿入されなかったことを確認するには、次のコマンドを実行します。

SELECT * FROM users;

期待される出力 (Expected Output):

1|Alice|[email protected]

出力は、ユーザー名 'Alice' を持つ元のレコードのみがテーブルに存在することを示しています。重複レコードは無視されました。

INSERT OR IGNORE ステートメントは、制約に違反する可能性のあるデータを挿入するときに、エラーを防ぎ、データの整合性を維持する方法を提供します。

制約違反を処理するために ON CONFLICT REPLACE を使用する (Use ON CONFLICT REPLACE to Handle Constraint Violations)

このステップでは、ON CONFLICT REPLACE 句を使用して制約違反を処理する方法を学びます。この句は、制約に違反する場合、SQLite に既存のレコードを新しいレコードで置き換えるように指示します。

sqlite> プロンプトで次のコマンドを実行します。

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', '[email protected]');

このコマンドは、ユーザー名 'Alice' を持つ新しいレコードを挿入しようとします。ON CONFLICT REPLACE 句が使用されているため、SQLite は既存のレコードを新しいレコードで置き換えます。REPLACE は古い行を削除して新しい行を挿入するため、この場合は id を指定する必要があることに注意してください。

レコードが置き換えられたことを確認するには、次のコマンドを実行します。

SELECT * FROM users;

期待される出力 (Expected Output):

1|Alice|[email protected]

出力は、ユーザー名 'Alice' を持つレコードのメールアドレスが [email protected] に更新されたことを示しています。

INSERT OR REPLACE ステートメントは、データの整合性を維持しながら既存のレコードを更新する方法を提供します。

最後に、SQLite シェルを終了します。

.exit

これにより、データベース接続が閉じられ、ターミナルに戻ります。

まとめ (Summary)

この実験 (lab) では、SQLite データベースで効果的にエラーを処理する方法を学びました。特に、INSERT 操作中の制約違反に焦点を当てました。データベースと UNIQUE 制約を持つテーブルを作成し、データを挿入した後、重複データを挿入してエラーを発生させようとしました。次に、ON CONFLICT IGNORE および ON CONFLICT REPLACE 句を使用してこれらの制約違反を処理する方法を検討し、SQLite が潜在的なエラーにどのように対応するかを制御し、データの整合性を維持できるようにしました。