Ubuntu20.04でNode.jsでPostgreSQLを使用する方法
著者は、 Society of Women Engineers を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Node.js エコシステムは、データベースとのインターフェースのための一連のツールを提供します。 それらのツールの1つは、 node-postgres です。これには、Node.jsがPostgreSQLデータベースとインターフェイスできるようにするモジュールが含まれています。 使用する node-postgres
、PostgreSQLデータベースのデータにアクセスして保存できるNode.jsプログラムを作成できるようになります。
このチュートリアルでは、 node-postgres
PostgreSQL(略してPostgres)データベースに接続してクエリを実行します。 まず、Postgresでデータベースユーザーとデータベースを作成します。 次に、を使用してアプリケーションをPostgresデータベースに接続します。 node-postgres
モジュール。 その後、使用します node-postgres
PostgreSQLデータベースのデータを挿入、取得、および変更します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
root以外のユーザーアカウント
sudo
Ubuntu20.04で有効になっている特権とファイアウォール。 チュートリアルUbuntu20.04 を使用したサーバーの初期セットアップに従って、サーバーをセットアップします。 -
UbuntuにインストールされたNode.js。 Node.jsをインストールしていない場合は、 Ubuntu20.04にNode.jsをインストールする方法に従ってください。
-
サーバーにPostgreSQLがインストールされています。 ガイドUbuntu20.04にPostgreSQLをインストールして使用する方法に従って、UbuntuにPostgreSQLをインストールします。
-
PostgreSQLでクエリを作成する方法の基本的な知識。詳細については、PostgreSQLでのクエリの概要を参照してください。
-
Node.jsプログラムの作成方法の基本については、Node.jsで最初のプログラムを作成して実行する方法を参照してください。
-
JavaScriptで非同期関数を作成する方法の基本的な理解。 基本を学ぶために、 JavaScript チュートリアルでのイベントループ、コールバック、プロミス、および非同期/待機について理解してください。
ステップ1-プロジェクトディレクトリの設定
このステップでは、ノードアプリケーションのディレクトリを作成してインストールします node-postgres
を使用して npm
. このディレクトリは、相互作用するPostgreSQLデータベースと構成ファイルの構築に取り組む場所です。
を使用してプロジェクトのディレクトリを作成します mkdir
指図:
- mkdir node_pg_app
を使用して、新しく作成されたディレクトリに移動します cd
指図:
- cd node_pg_app
ディレクトリを初期化する package.json
を使用してファイル npm init
指図:
- npm init -y
The -y
フラグはデフォルトを作成します package.json
ファイル。
次に、 node-postgres
モジュール付き npm install
:
- npm install pg
これで、プロジェクトのディレクトリが設定され、インストールされました node-postgres
依存関係として。 これで、Postgresでユーザーとデータベースを作成する準備が整いました。
ステップ2—PostgreSQLでデータベースユーザーとデータベースを作成する
このステップでは、アプリケーションのデータベースユーザーとデータベースを作成します。
初めてUbuntuにPostgresをインストールすると、ユーザーが作成されます postgres
システムでは、 postgres
、およびデータベース postgres
. ユーザー postgres
ユーザーやデータベースの作成などの管理タスクを実行できるPostgreSQLセッションを開くことができます。
PostgreSQLはidentauthentication 接続スキームを使用します。これにより、Ubuntuのユーザーは、ユーザー名がPostgresユーザーと類似している限り、Postgresシェルにログインできます。 あなたはすでに持っているので postgres
Ubuntuのユーザーと postgres
あなたに代わって作成されたPostgreSQLのユーザーは、Postgresシェルにログインできます。
ログインするには、Ubuntuユーザーをに切り替えます postgres
と sudo
を使用してPostgresシェルにログインします psql
指図:
- sudo -u postgres psql
コマンドの引数は次のことを表します。
-u
:Ubuntuでユーザーを特定のユーザーに切り替えるフラグ。 通過postgres
引数としてのuserは、Ubuntuのユーザーをに切り替えますpostgres
.psql
:SQLコマンドを入力してデータベース、ロール、テーブルなどを作成できるPostgresインタラクティブターミナルプログラム。
Postgresシェルにログインすると、ターミナルは次のようになります。
-
postgres
対話するデータベースの名前であり、 #
スーパーユーザーとしてログインしていることを示します。
Nodeアプリケーションの場合、アプリケーションがPostgresへの接続に使用する個別のユーザーとデータベースを作成します。
これを行うには、強力なパスワードを使用して新しい役割を作成します。
- CREATE USER fish_user WITH PASSWORD 'password';
Postgresでの役割は、ユースケースに応じてユーザーまたはグループと見なすことができます。 このチュートリアルでは、ユーザーとして使用します。
次に、データベースを作成し、作成したユーザーに所有権を割り当てます。
- CREATE DATABASE fish OWNER fish_user;
データベースの所有権をに割り当てる fish_user
データを作成、ドロップ、およびテーブルに挿入するためのロール権限を付与します。 fish
データベース。
ユーザーとデータベースを作成したら、Postgresインタラクティブシェルを終了します。
- \q
Postgresシェルにログインするには fish_user
、作成したPostgresユーザーと同様の名前でUbuntuにユーザーを作成する必要があります。
でユーザーを作成します adduser
指図:
- sudo adduser fish_user
これで、Ubuntuでユーザー、PostgreSQLユーザー、およびNodeアプリケーション用のデータベースが作成されました。 次に、を使用してPostgreSQLインタラクティブシェルにログインします。 fish_user
テーブルを作成します。
ステップ3—ロールを使用してPostgresシェルを開き、テーブルを作成する
このセクションでは、Ubuntuで前のセクションで作成したユーザーでPostgresシェルを開きます。 シェルにログインしたら、Node.jsアプリのテーブルを作成します。
としてシェルを開くには fish_user
、次のコマンドを入力します。
- sudo -u fish_user psql -d fish
sudo -u fish_user
Ubuntuユーザーをに切り替えます fish_user
その後、を実行します psql
そのユーザーとしてのコマンド。 The -d
フラグは、接続するデータベースを指定します。 fish
この場合。 データベースを指定しない場合は、 psql
接続しようとします fish_user
デフォルトではデータベース。これは検出されず、エラーがスローされます。
ログインしたら psql
シェルの場合、シェルプロンプトは次のようになります。
-
fish
に接続していることを示します fish
データベース。
を使用して接続を確認できます \conninfo
指図:
- \conninfo
次のような出力が表示されます。
OutputYou are connected to database "fish" as user "fish_user" via socket in "/var/run/postgresql" at port "5432".
出力は、あなたが実際にとしてログインしたことを確認します fish_user
そして、あなたはに接続しています fish
データベース。
次に、アプリケーションが挿入するデータを含むテーブルを作成します。
作成するテーブルは、サメの名前とその色を追跡します。 データを入力すると、次のようになります。
id | 名前 | 色 |
---|---|---|
1 | サミー | 青 |
2 | ホセ | ティール |
SQLの使用 create table
コマンド、テーブルを作成します:
- CREATE TABLE shark(
- id SERIAL PRIMARY KEY,
- name VARCHAR(50) NOT NULL,
- color VARCHAR(50) NOT NULL);
-
The CREATE TABLE shark
コマンドは、3列のテーブルを作成します。
-
id
:テーブルの自動インクリメントフィールドと主キー。 行を挿入するたびに、Postgresはインクリメントしてデータを入力しますid
価値。 -
name
とcolor
:50文字を格納できるフィールド。NOT NULL
フィールドが空になるのを防ぐ制約です。
テーブルが適切な所有者で作成されているかどうかを確認します。
- \dt
The \dt
コマンドは、データベース内のすべてのテーブルを一覧表示します。
コマンドを実行すると、出力は次のようになります。
List of relations
Schema | Name | Type | Owner
--------+-------+-------+-----------
public | shark | table | fish_user
(1 row)
出力は、 fish_user
を所有している shark
テーブル。
次に、Postgresシェルを終了します。
- \q
プロジェクトディレクトリに戻ります。
テーブルを作成したら、 node-postgres
Postgresに接続するモジュール。
ステップ4—Postgresデータベースに接続する
このステップでは、 node-postgres
Node.jsアプリケーションをPostgreSQLデータベースに接続します。 そのためには、 node-postgres
接続プールを作成します。 接続プールはデータベース接続のキャッシュとして機能し、アプリがすべてのデータベース要求に接続を再利用できるようにします。 これにより、アプリケーションを高速化し、サーバーリソースを節約できます。
を作成して開きます db.js
お好みのエディタでファイルします。 このチュートリアルでは、 nano
、ターミナルテキストエディタ:
- nano db.js
あなたの中で db.js
ファイル、で必要 node-postgres
モジュールを作成し、destructuringassignmentを使用してクラスを抽出します Pool
から node-postgres
.
const { Pool } = require('pg')
次に、 Pool
接続プールを作成するインスタンス:
const { Pool} = require('pg')
const pool = new Pool({
user: 'fish_user',
database: 'fish',
password: 'password',
port: 5432,
host: 'localhost',
})
作成するとき Pool
たとえば、構成オブジェクトを引数として渡します。 このオブジェクトには詳細が含まれています node-postgres
Postgresへの接続を確立するために使用します。
オブジェクトは、次のプロパティを定義します。
user
:Postgresで作成したユーザー。database
:Postgresで作成したデータベースの名前。password
:ユーザーのパスワードfish_user
.port
:Postgresがリッスンしているポート。5432
デフォルトのポートです。host
:必要なPostgresサーバーnode-postgres
接続する。 それを渡すlocalhost
接続しますnode-postgres
システムにインストールされているPostgresサーバーに接続します。 Postgresサーバーが別のドロップレット上にある場合、host
このようになります:host: server_ip_address
.
注:本番環境では、構成値を次のような別のファイルに保持することをお勧めします。 .env
ファイル。 その後、このファイルはに追加されます .gitignore
バージョン管理で追跡しないようにGitを使用する場合はファイル。 利点は、あなたのような機密情報を隠すことです password
, user
、 と database
攻撃者から。
インスタンスを作成すると、データベース接続が確立され、 Pool
オブジェクトはに保存されます pool
変数。 これをアプリのどこでも使用するには、エクスポートする必要があります。 あなたの中で db.js
ファイル、要求し、のインスタンスを定義します Pool
オブジェクト、およびそのプロパティと値を設定します。
const { Pool } = require("pg");
const pool = new Pool({
user: "fish_user",
database: "fish",
password: "password",
port: 5432,
host: "localhost",
});
module.exports = { pool };
ファイルを保存して終了します nano
を押すことによって CTRL+X
. 入る y
変更を保存し、を押してファイル名を確認します ENTER
また RETURN
Macのキー。
アプリケーションをPostgresに接続したので、この接続を使用してPostgresにデータを挿入します。
ステップ5—Postgresデータベースへのデータの挿入
このステップでは、で作成した接続プールを使用してPostgreSQLデータベースにデータを追加するプログラムを作成します。 db.js
ファイル。 プログラムが実行されるたびに異なるデータを挿入するようにするには、コマンドライン引数を受け入れる機能をプログラムに与えます。 プログラムを実行するときに、サメの名前と色を渡します。
作成して開く insertData.js
エディター内のファイル:
- nano insertData.js
あなたの中で insertData.js
ファイルに次のコードを追加して、スクリプトにコマンドライン引数を処理させます。
const { pool } = require("./db");
async function insertData() {
const [name, color] = process.argv.slice(2);
console.log(name, color);
}
insertData();
まず、 pool
からのオブジェクト db.js
ファイル。 これにより、プログラムはデータベース接続を使用してデータベースにクエリを実行できます。
次に、宣言します insertData()
非同期関数として機能します async
キーワード。 これにより、 await
データベース要求を非同期にするキーワード。
以内 insertData()
関数、あなたは使用します process
コマンドライン引数にアクセスするためのモジュール。 Node.js process.argv
メソッドは、配列内のすべての引数を返します。 node
と insertData.js
引数。
たとえば、ターミナルでスクリプトを実行すると、 node insertData.js sammy blue
、 process.argv
メソッドは配列を返します: ['node', 'insertData.js', 'sammy', 'blue']
(配列は簡潔にするために編集されています)。
最初の2つの要素をスキップするには: node
と insertData.js
、JavaScriptを追加します slice()
方法 process.argv
方法。 これにより、インデックス2以降の要素が返されます。 次に、これらの引数は次のように分解されます。 name
と color
変数。
ファイルを保存して終了します nano
と CTRL+X
. を使用してファイルを実行します node
それに引数を渡します sammy
、 と blue
:
- node insertData.js sammy blue
コマンドを実行すると、次の出力が表示されます。
Outputsammy blue
これで、関数はにアクセスできるようになります name
とサメ color
コマンドライン引数から。 次に、を変更します insertData()
データをに挿入する関数 shark
テーブル。
を開きます insertData.js
テキストエディタでファイルを再度作成し、強調表示されたコードを追加します。
const { pool } = require("./db");
async function insertData() {
const [name, color] = process.argv.slice(2);
const res = await pool.query(
"INSERT INTO shark (name, color) VALUES ($1, $2)",
[name, color]
);
console.log(`Added a shark with the name ${name}`);
}
insertData();
さて、 insertData()
関数はを定義します name
と color
サメの。 次に、それは待っています pool.query
からの方法 node-postgres
SQLステートメントを取ります INSERT INTO shark (name, color) ...
最初の引数として。 SQLステートメントはレコードをに挿入します shark
テーブル。 これは、パラメーター化されたクエリと呼ばれるものを使用します。 $1
、 と $2
に対応します name
と color
で提供される配列内の変数 pool.query()
2番目の引数としてのメソッド: [name, color]
. Postgresがステートメントを実行しているとき、変数はSQLインジェクションからアプリケーションを安全に保護するために置き換えられます。 クエリの実行後、関数は次を使用して成功メッセージをログに記録します console.log()
.
スクリプトを実行する前に、コードを内部にラップします insertData()
try … catch ブロックで関数を実行して、ランタイムエラーを処理します。
const { pool } = require("./db");
async function insertData() {
const [name, color] = process.argv.slice(2);
try {
const res = await pool.query(
"INSERT INTO shark (name, color) VALUES ($1, $2)",
[name, color]
);
console.log(`Added a shark with the name ${name}`);
} catch (error) {
console.error(error)
}
}
insertData()
関数が実行されると、内部のコードは try
ブロックが実行されます。 成功した場合、関数はスキップします catch
ブロックして終了します。 ただし、エラーが内部でトリガーされた場合 try
ブロック、 catch
ブロックが実行され、コンソールにエラーが記録されます。
これで、プログラムはコマンドライン引数を取り、それらを使用してレコードを shark
テーブル。
保存して、テキストエディタを終了します。 を実行します insertData.js
とファイル sammy
と blue
コマンドライン引数として:
- node insertData.js sammy blue
次の出力が表示されます。
OutputAdded a shark with the name sammy
コマンドを実行すると、名前がサメのテーブルにレコードが挿入されます sammy
と色 blue
.
次に、でファイルを再実行します jose
と teal
コマンドライン引数として:
- node insertData.js jose teal
出力は次のようになります。
OutputAdded a shark with the name jose
これは、別のレコードをに挿入したことを確認します shark
名前のテーブル jose
と色 teal
.
これで、2つのレコードが挿入されました shark
テーブル。 次のステップでは、データベースからデータを取得します。
ステップ6—Postgresデータベースからデータを取得する
このステップでは、内のすべてのレコードを取得します shark
使用するテーブル node-postgres
、コンソールにログインします。
ファイルを作成して開きます retrieveData.js
お気に入りのエディターで:
- nano retrieveData.js
あなたの中で retrieveData.js
、データベースからデータを取得するには、次のコードを追加します。
const { pool } = require("./db");
async function retrieveData() {
try {
const res = await pool.query("SELECT * FROM shark");
console.log(res.rows);
} catch (error) {
console.error(error);
}
}
retrieveData()
The retrieveData()
関数は、内のすべての行を読み取ります shark
テーブルを作成し、コンソールに記録します。 関数内 try
ブロック、あなたは pool.query()
からの方法 node-postgres
引数としてSQLステートメントを使用します。 SQLステートメント SELECT * FROM shark
内のすべてのレコードを取得します shark
テーブル。 それらが取得されると、 console.log()
ステートメントは行をログに記録します。
エラーがトリガーされた場合、実行はスキップされます catch
ブロックし、エラーをログに記録します。 最後の行で、 retrieveData()
関数。
次に、エディターを保存して閉じます。 を実行します retrieveData.js
ファイル:
- node retrieveData.js
次のような出力が表示されます。
Output[
{ id: 1, name: 'sammy', color: 'blue' },
{ id: 2, name: 'jose', color: 'teal' }
]
node-postgres
JSONのようなオブジェクトでテーブルの行を返します。 これらのオブジェクトは配列に格納されます。
これで、データベースからデータを取得できます。 次に、を使用してテーブル内のデータを変更します node-postgres
.
ステップ7—Postgresデータベースのデータを変更する
このステップでは、 node-postgres
Postgresデータベースのデータを変更します。 これにより、いずれかのデータを変更できます。 shark
テーブルレコード。
2つのコマンドライン引数を取るスクリプトを作成します。 id
と name
. を使用します id
テーブルに必要なレコードを選択するための値。 The name
引数は、名前を変更するレコードの新しい値になります。
を作成して開きます modifyData.js
ファイル:
- nano modifyData.js
あなたの中で modifyData.js
ファイルに次のコードを追加して、のレコードを変更します shark
テーブル:
const { pool } = require("./db");
async function modifyData() {
const [id, name] = process.argv.slice(2);
try {
const res = await pool.query("UPDATE shark SET name = $1 WHERE id = $2", [
name,
id,
]);
console.log(`Updated the shark name to ${name}`);
} catch (error) {
console.error(error);
}
}
modifyData();
まず、あなたは pool
からのオブジェクト db.js
あなたのファイル modifyData.js
ファイル。
次に、非同期関数を定義します modifyData()
Postgresのレコードを変更します。 関数内で、2つの変数を定義します id
と name
破壊的割り当てを使用してコマンドライン引数から。
以内 try
ブロック、あなたは pool.query
からの方法 node-postgres
最初の引数としてSQLステートメントを渡します。 に UPDATE
SQLステートメント、 WHERE
句は、に一致するレコードを選択します id
価値。 選択したら、 SET name = $1
名前フィールドの値を新しい値に変更します。
次、 console.log
レコード名が変更されると実行されるメッセージをログに記録します。 最後に、あなたは modifyData()
最後の行で機能します。
を使用してファイルを保存して終了します CTRL+X
. を実行します modifyData.js
とファイル 2
と san
引数として:
- node modifyData.js 2 san
次の出力が表示されます。
OutputUpdated the shark name to san
レコード名がから変更されたことを確認するには jose
に san
、を実行します retrieveData.js
ファイル:
- node retrieveData.js
次のような出力が得られます。
Outputoutput
[
{ id: 1, name: 'sammy', color: 'blue' },
{ id: 2, name: 'san', color: 'teal' }
]
これで、IDを持つレコードが表示されます。 2
新しい名前になりました san
交換 jose
.
これで、を使用してデータベース内のレコードを正常に更新できました。 node-postgres
.
結論
このチュートリアルでは、 node-postgres
Postgresデータベースに接続してクエリを実行します。 まず、Postgresでユーザーとデータベースを作成しました。 次に、テーブルを作成し、を使用してアプリケーションをPostgresに接続しました node-postgres
、およびを使用してPostgresでデータを挿入、取得、および変更します node-postgres
モジュール。
詳細については node-postgres
、ドキュメントにアクセスしてください。 Node.jsのスキルを向上させるために、Node.jsシリーズのコーディング方法を調べることができます。