CHECK 制約を使用したデータ検証 (PostgreSQL) (2023)

ガイド/その他のガイド/高度なデータベースタスク/高度なデータ検証

概要

このページでは設定方法を説明します制約をチェックするPostgreSQL データベース内。チェック制約は、値をテーブルに保存する前に満たさなければならない条件です。たとえば、製品の割引価格は常に元の価格よりも低くなければなりません。

チェック制約は、テーブルの作成時に追加できます (次を使用します)。テーブルの作成)またはすでに存在するテーブル(を使用して)他の机)。このガイドでは、4 つの組み合わせすべてを説明します。

このガイドの最後では、データベースをイントロスペクトし、Prisma クライアントを生成し、制約を検証するための単純な Node.js スクリプトを作成します。

前提条件

このガイドに従うには、次のものが必要です。

  • あるPostgreSQLデータベースサーバーが稼働中
  • 作成されましたbコマンドラインユーティリティ
  • psqlPostgreSQL のコマンド ライン クライアント
  • Node.jsあなたのマシンにインストールされている

1. 新しいデータベースとプロジェクト ディレクトリを作成します。

まず、このガイド全体で作成するファイル用のプロジェクト ディレクトリを作成します。ターミナルまたはコマンドラインを開き、次のコマンドを実行します。

mkdir チェックデモ

CDチェックデモ

次に、PostgreSQL データベース サーバーが実行されていることを確認します。デフォルトを認証するポストグレユーザー:

Unix (bash):

sudo -u postgres

Windows (コマンドライン):

psql -U postgres

次に、ターミナルで次のコマンドを実行して、という新しいデータベースを作成します。チェックデモ:

Unix (bash):

作成済みb チェックデモ

Windows (コマンドライン):

データベース CheckDemo を作成します。

\CheckDemo に接続する

ヒント: 末尾を覚えておいてください;postgres=# postgres-#

データベースが作成されたことを検証するには、次のコマンドを実行します。\dtすべてのテーブルをリストするコマンド (関係) データベース内にあります (現時点では何もありません):

Unix (bash):

psql -d CheckDemo -c "\dt"

Windows (コマンドライン):

d チェックデモ -c \dt

2. 単一の列に単一のチェック制約を持つテーブルを追加する

このセクションでは、次のことを行います単一の列に単一のチェック制約を持つ新しいテーブルを作成するの中にチェックデモデータベース。

という名前の新しいファイルを作成します単一列チェック制約.sql次のコードを追加します。

作成 テーブル "公共""製品" (

価格数値 制約価格_値_チェックチェック (価格> 0.01 価格<> 1240.00)

);

変更 テーブル "公共""製品"

追加 "製品番号" シリアル

追加 主要な ("製品番号");

次に、データベースに対して SQL ステートメントを実行して、という新しいテーブルを作成します。製品:

Unix (bash):

psql CheckDemo < 単一列チェック制約.sql

Windows (コマンドライン):

\i 'c:/checkdemo/single-column-check-constraint.sql'

おめでとうございます。というテーブルが作成されました。製品データベース内で。テーブルには 1 つの列があります。価格、製品の価格が次のとおりであることを保証する単一のチェック制約があります。

  • 0.01 未満になることはありません
  • 1240.00 に等しくない

次のコマンドを実行して、に適用されるチェック制約のリストを表示します。製品テーブル:

\d+ 製品

すべてのチェック制約のリストを含む次の出力が表示されます。

テーブル「public.product」

コラム |タイプ |照合 | Null 可能 |デフォルト |ストレージ |統計目標 |説明

--------+--------+----------+----------+-------- -+----------+--------------+---------------

価格 |数値 | | | |メイン | |

制約を確認します。

"price_value_check" CHECK (価格 > 0.01 AND 価格 <> 1240.00)

制約名を指定しない場合、PostgreSQL が制約名を自動生成することに注意してください。たとえば、次のように作成された制約は、価格数値チェック (価格 > 0.01 かつ 価格 <> 1240.00)だろう価格_チェック

3. 複数列チェック制約を持つテーブルの追加

次に、あなたは、複数列のチェック制約を持つテーブルを作成する2 つの列の値を比較します。

という名前の新しいファイルを作成します複数列チェック制約.sql次のコードを追加します。

作成 テーブル "公共"「別の製品」 (

値下げした価格数値 制約値下げ_価格_チェックチェック (価格>値下げした価格)

価格数値

);

変更 テーブル "公共"「別の製品」

追加 "製品番号" シリアル

追加 主要な ("製品番号");

次に、データベースに対して SQL ステートメントを実行して、という新しいテーブルを作成します。別の製品:

Unix (bash):

psql CheckDemo < multi-column-check-constraint.sql

Windows (コマンドライン):

\i 'c:/checkdemo/multi-column-check-constraint.sql'

おめでとうございます。というテーブルが作成されました。別の製品データベース内で。テーブルには 2 つの列があります。値下げした価格価格。の値下げした価格列には、次の値が存在することを保証するチェック制約があります。値下げした価格は常に次の値より小さいです価格

4. 複数の検査制約を持つテーブルの追加

次に、あなたは、複数のチェック制約を持つテーブルを作成する異なる列にあります。

という名前の新しいファイルを作成します複数のチェック制約.sql次のコードを追加します。

作成 テーブル "公共"「最後から二番目の製品」 (

値下げした価格数値 制約値下げ_価格_チェックチェック (価格>値下げした価格)

価格数値

タグ文章[] 制約tags_contains_productチェック ('製品' = どれでも(タグ))

);

変更 テーブル "公共"「最後から二番目の製品」

追加 "製品番号" シリアル

追加 主要な ("製品番号");

次に、データベースに対して SQL ステートメントを実行して、という新しいテーブルを作成します。最後から二番目の製品:

Unix (bash):

psql CheckDemo < multiple-check-constraints.sql

Windows (コマンドライン):

\i 'c:/checkdemo/multiple-check-constraints.sql'

おめでとうございます。というテーブルが作成されました。最後の製品データベース内で。テーブルには、という名前の 3 つの列があります。値下げした価格価格タグ、および次のチェック制約があります。

  • タグ列 (配列) には、という名前のタグが含まれている必要があります。製品
  • の値値下げした価格の値より小さくなければなりません価格

5. 既存のテーブルへのチェック制約の追加

このセクションでは、次のことを行いますデータベースにすでに存在するテーブルにチェック制約を追加する。これを行うには、まず新しいテーブルを作成し、次にテーブルを変更して制約を追加する必要があります。

という名前の新しいファイルを作成しますadd-single-check-constraint-later.sql次のコードを追加します。

作成 テーブル "公共"「最後の製品」 (

カテゴリー文章

);

変更 テーブル "公共"「最後の製品」

追加 制約 「カテゴリー_衣類ではない」 チェック (カテゴリー<> '衣類');

このコードには 2 つの SQL ステートメントが含まれています。

  1. という名前の新しいテーブルを作成します。最後の製品
  2. テーブルを変更して、という名前のチェック制約を追加します。価格_not_zero_constraint

次に、データベースに対して SQL ステートメントを実行して、という新しいテーブルを作成します。最後の製品:

Unix (bash):

psql CheckDemo < add-single-check-constraint-later.sql

Windows (コマンドライン):

\i 'c:/checkdemo/add-single-check-constraint-later.sql'

おめでとうございます。というテーブルが作成されました。最後の製品データベース内に という名前の単一の列があります価格。という名前の制約を追加しました価格_not_zero_constraint2 番目の SQL コマンドを使用して、製品の価格が 0.01 を下回らないようにします。

6. Prisma を使用してデータベースをイントロスペクトする

前のセクションでは、異なるチェック制約を持つ 4 つのテーブルを作成しました。

  • 製品テーブルには、次の値を保証するチェック制約があります。価格決してそれ以下ではありません0.01そして決して正確には1240.00
  • 別の製品テーブルには、次の値を保証するチェック制約があります。値下げした価格の値を超えることはありません価格
  • 最後から二番目の製品テーブルには 2 つのチェック制約があります。1 つは、値下げした価格の値を超えることはありません価格、そして、タグ配列には常に値が含まれます製品
  • 最後の製品テーブルには、次の値を保証するチェック制約があります。カテゴリー決してない衣類

このセクションでは、データベースをイントロスペクトして、これらのテーブルの Prisma モデルを生成します。

ノート: チェック制約は現在、生成された Prisma スキーマには含まれていませんが、基礎となるデータベースは引き続き制約を適用します。

まず、新しい Node.js プロジェクトをセットアップし、プリズマ開発依存関係としての CLI:

npm init -y

npm install prisma --save-dev

データベースをイントロスペクトするには、Prisma にデータベースへの接続方法を指示する必要があります。これを行うには、情報元Prisma スキーマ内。

という名前の新しいファイルを作成しますスキームのプリズム次のコードを追加します。

スキームのプリズム

1情報元データベース{

2プロバイダー= 「ポストグレSQL」

3URL= 環境(「DATABASE_URL」)

4}

データベース接続 URL は環境変数を介して設定されます。 Prisma CLI は自動的にサポートします。ドテンフという名前のファイルに定義された環境変数を自動的に取得する形式.env

という名前の新しいファイルを作成します.envデータベース接続 URL を次のように設定します。DATABASE_URL環境変数:

DATABASE_URL=postgresql://__USER__:__PASSWORD__@__HOST__:__PORT__/CheckDemo

上記のコード スニペットでは、大文字のプレースホルダーを独自の接続詳細に置き換える必要があります。たとえば、データベースがローカルで実行されている場合、次のようになります。

DATABASE_URL=postgresql://janedoe:mypassword@localhost:5432/CheckDemo

両方ともスキームのプリズム.envファイルを配置したら、次のコマンドを使用して Prisma のイントロスペクションを実行できます。

npx プリズマ DB プル

このコマンドはデータベースをイントロスペクトし、テーブルごとに Prisma モデルを Prisma スキーマに追加します。

スキームのプリズム

1発生器クライアント{

2プロバイダー= 「プリズマクライアント-js」

3}

4

5情報元データベース{

6プロバイダー= 「ポストグレSQL」

7URL= 環境(「DATABASE_URL」)

8}

9

10モデル別の製品{

11価格浮く?

12製品番号内部 @id

13値下げした価格浮く?

14}

15

16モデル最後の製品{

17カテゴリー?

18製品番号内部 @id

19}

20

21モデル製品{

22価格浮く?

23製品番号内部 @id

24}

25

26モデル最後から二番目の製品{

27価格浮く?

28製品番号内部 @id

29値下げした価格浮く?

30タグ[]

31}

7. Prismaクライアントの生成

チェック制約が機能するかどうかを検証するために、Prisma Client を生成し、いくつかのサンプル クエリをデータベースに送信します。

まず、発生器ブロックを Prisma スキーマに追加します (通常は、情報元ブロック):

スキームのプリズム

1発生器クライアント{

2プロバイダー= 「プリズマクライアント-js」

3}

次のコマンドを実行して、プロジェクトに Prisma Client をインストールして生成します。

npx プリズマ生成

これで、Prisma Client を使用して Node.js でデータベース クエリを送信できるようになりました。

8. Node.js スクリプトのチェック制約を検証する

という名前の新しいファイルを作成しますインデックス.js次のコードを追加します。

定数 { プリズマクライアント } = 必須(「@プリズマ/クライアント」)

定数プリズマ= 新しい プリズマクライアント()

非同期 関数 主要() {

定数新製品= 待つプリズマ製品作成({

データ: {

価格: 0.0

}

})

コンソールログ(新製品)

}

主要()

このコードでは、価格が次の製品を作成しています。0.00に設定されたチェック制約を満たしていません。価格桁。

次のコマンドでコードを実行します。

ノードインデックス.js

スクリプトは、次のことを示すエラーをスローします。価格チェック値チェック制約が満たされませんでした:

クエリの実行中にエラーが発生しました:

ConnectorError(ConnectorError { user_facing_error: なし、種類: QueryError(Error { 種類: Db、原因: Some(DbError { 重大度: "ERROR"、parsed_severity: Some(エラー)、コード: SqlState("23514")、メッセージ: "newリレーション \"product\" の行がチェック制約 \"price_value_check\"" に違反しています。詳細: Some("失敗した行には (0, 11) が含まれています。")、ヒント: なし、位置: なし、where_: なし、スキーマ: Some ("public")、テーブル: Some("product")、列: なし、データ型: なし、制約: Some("price_value_check")、ファイル: Some("d:\\pginstaller_12.auto\\postgres.windows- x64\\src\\backend\\executor\\execmain.c")、行: Some(2023)、ルーチン: Some("ExecConstraints") }) }) })

複数列チェック制約を検証するには、次のコードを置き換えます。インデックス.js以下のとおりです。

定数 { プリズマクライアント } = 必須(「@プリズマ/クライアント」)

定数プリズマ= 新しい プリズマクライアント()

非同期 関数 主要() {

定数新製品= 待つプリズマ別の製品作成({

データ: {

価格: 50.0

値下げした価格: 100.0

}

})

コンソールログ(新製品)

}

主要()

このコードでは、割引価格が実際の価格よりも高くなる製品を作成しています。

次のコマンドを使用してスクリプトを再度実行します。

ノードインデックス.js

今度は、次のことを示す同様のエラー メッセージが表示されます。値下げ_価格_チェックチェック制約が満たされませんでした:

ConnectorError(ConnectorError { user_facing_error: なし、種類: QueryError(Error { 種類: Db、原因: Some(DbError { 重大度: "ERROR"、parsed_severity: Some(エラー)、コード: SqlState("23514")、メッセージ: "newリレーション「anotherproduct」の行はチェック制約「reduced_price_check」に違反しています。詳細: Some(「失敗した行には (100, 50, 1) が含まれています。」)、ヒント: なし、位置: なし、where_: なし、スキーマ: Some("public")、テーブル: Some("anotherproduct")、列: なし、データ型: なし、制約: Some("reduced_price_check")、ファイル: Some("d:\\pginstaller_12.auto\\postgres. windows-x64\\src\\backend\\executor\\execmain.c")、行: Some(2023)、ルーチン: Some("ExecConstraints") }) }) })

PrismaClientFetcher.request (C:\Work\Personal\prisma-check-constraint\node_modules\@prisma\client\index.js:89:17) で

最後に、スクリプトを変更して複数のチェック制約違反を含めます。

定数 { プリズマクライアント } = 必須(「@プリズマ/クライアント」)

定数プリズマ= 新しい プリズマクライアント()

非同期 関数 主要() {

定数新製品= 待つプリズマ最後から二番目の製品作成({

データ: {

タグ: {

設定: [「間違ったタグ」]

}

価格: 90.0

値下げした価格: 100.0

}

})

コンソールログ(新製品)

}

主要()

このコードでは、割引価格が実際の価格よりも高い商品を作成し、必要な部分を省略しています。製品鬼ごっこ。

次のコマンドを使用してスクリプトを再度実行します。

ノードインデックス.js

エラー メッセージには、値下げ_価格_チェック制約:

ConnectorError(ConnectorError { user_facing_error: なし、種類: QueryError(Error { 種類: Db、原因: Some(DbError { 重大度: "ERROR"、parsed_severity: Some(エラー)、コード: SqlState("23514")、メッセージ: "newリレーション \"secondtolastproduct\" の行はチェック制約 \"reduced_price_check\"" に違反しています。詳細: Some("失敗した行には (100, 90, {wrongtag}, 7) が含まれています。")、ヒント: なし、位置: なし、where_ : なし、スキーマ: Some("public")、テーブル: Some("secondtolastproduct")、列: なし、データ型: なし、制約: Some("reduced_price_check")、ファイル: Some("d:\\pginstaller_12.auto \\postgres.windows-x64\\src\\backend\\executor\\execmain.c")、行: Some(2023)、ルーチン: Some("ExecConstraints") }) }) })

チェック制約はアルファベット順に解決され、最初に失敗した制約のみがエラー メッセージに表示されます。

これは役に立ちましたか?

GitHub でこのページを編集する

References

Top Articles
Latest Posts
Article information

Author: Carmelo Roob

Last Updated: 06/18/2023

Views: 5315

Rating: 4.4 / 5 (45 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Carmelo Roob

Birthday: 1995-01-09

Address: Apt. 915 481 Sipes Cliff, New Gonzalobury, CO 80176

Phone: +6773780339780

Job: Sales Executive

Hobby: Gaming, Jogging, Rugby, Video gaming, Handball, Ice skating, Web surfing

Introduction: My name is Carmelo Roob, I am a modern, handsome, delightful, comfortable, attractive, vast, good person who loves writing and wants to share my knowledge and understanding with you.