ガイド/その他のガイド/高度なデータベースタスク/高度なデータ検証
概要
このページでは設定方法を説明します制約をチェックするPostgreSQL データベース内。チェック制約は、値をテーブルに保存する前に満たさなければならない条件です。たとえば、製品の割引価格は常に元の価格よりも低くなければなりません。
チェック制約は、テーブルの作成時に追加できます (次を使用します)。テーブルの作成
)またはすでに存在するテーブル(を使用して)他の机
)。このガイドでは、4 つの組み合わせすべてを説明します。
このガイドの最後では、データベースをイントロスペクトし、Prisma クライアントを生成し、制約を検証するための単純な Node.js スクリプトを作成します。
前提条件
このガイドに従うには、次のものが必要です。
- あるPostgreSQLデータベースサーバーが稼働中
- の
作成されましたb
コマンドラインユーティリティ - の
psql
PostgreSQL のコマンド ライン クライアント - 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 ステートメントが含まれています。
- という名前の新しいテーブルを作成します。
最後の製品
- テーブルを変更して、という名前のチェック制約を追加します。
価格_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_constraint
2 番目の 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") }) }) })
チェック制約はアルファベット順に解決され、最初に失敗した制約のみがエラー メッセージに表示されます。