SQL・Databese を基本からまとめてみた【PostgreSQL入門】

## PostgreSQLとは？

[PostgreSQL](https://www.postgresql.jp/download)
　PostgreSQL（ポストグレスキューエル）とはオープンソースのリレーショナルデータベース管理システム（RDBMS）のデータ管理システムのこと。Linux、macOSといったUNIX系OSはもちろんのこと、Windowsにも対応している。すべてのソースは公開されており、用途を問わず無料で利用できる。RDBMS（リレーショナルデータベース管理システム）として基本的な機能を備えており、SQL言語を使ったデータの作成・編集といったデータ管理機能や、サブクエリ、トリガー、バックアップなどの障害回復機能、同時実行制御などに対応している。拡張性が高く、インデックスやデータ型などさまざまな要素のユーザー定義が可能。 

 
## 環境の準備

①ターミナルで、アプリケーションを作成する。
```
mkdir <プロジェクト名>
cd <プロジェクト名>
```
③ 必要なモジュールやライブラリをインストールする。
```
touch  <ファイル名>.js
npm init -y
npm i express nodemon pg
```
※ nodemon とは、コードを監視して、保存後サーバーを自動で更新してくれるツールのこと

④下記に変更する

```package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon server.js"
  },
```
⑤ postgresqlとインストールする
```
brew install postgresql
//インストールが完了したら、起動して実行する必要がある
brew services start postgresql
//サービスを停止したい場合
brew services stop postgresql
```
## SQL shellを立ち上げる

```
①何も入力せず、Enterを押す
Server [localhost]:
Database [postgres]: 
Port [5433]: 
Username [postgres]:

②postgresのパスワードを入力する
Password for user postgres: 

③Databaseを作成する
postgres=# CREATE DATABASE users;

③Tableを作成する
postgres=# ¥c users
postgres=# CREATE TABLE users(

④フィールドを作成する
postgres(#　ID serial primary key, 
postgres(#　name varchar(255),
postgres(#　email varchar(255),
postgres(#　age int);

⑤SQL文を書く
users-# insert into users(name, email, age)
users-# values ("shun", "shin@gmail.com", 23),("shin", "shun@gmail.com", 33);
```
## ファイル構成
```
 ├── db.js
 ├── package-lock.json
 ├── package.json
 └── server.js
```
```db.js
const Pool = require('pg').Pool;

const pool = new Pool({
  user: 'postgres',
  host: 'localhost',
  database: 'user',
  password: '5w7aybjz',
  port: 5432,
});

module.exports = pool;
```
```server.js
const express = require('express');
const app = express();
const PORT = 3000;
const pool = require('/db');

//APIを作成
app.use(express.json());
app.get('/', (req, res) => {
  res.send('Hello Express');
});

//User情報を全て取得する
app.get('/users', (req, res) => {
  pool.query('SELECT * FROM users', (error, results) => {
    if (error) throw error;
    return res.status(200).json(results.row);
  });
});

//特定のUserを取得する
app.get('/users/:id', (req, res) => {
  const id = req.params.id;

  pool.query('SELECT * FROM users WHERE id = $1', [id], (error, results) => {
    if (error) throw error;
    return res.status(200).json(results.row);
  });
});

//userを追加する
app.post('/users', (req, res) => {
  const { name, email, age } = req.body;
  //userが既に存在しているかどうか確認
  pool.query(
    'SELECT s FROM users s WHERE s.email = $1',
    [email],
    (error, results) => {
      if (results.rows.length) {
        res.send('既にユーザーが存在しています');
      }
      pool.query(
        'INSERT INTO users(name, email, age) values($1,$2,$3)',
        [name, email, age],
        (error, results) => {
          if (error) throw error;
          res.status(201).send('ユーザー作成に成功しました');
        }
      );
    }
  );
});

app.listen(PORT, () => {
  console.log('server is running on PORT' + PORT);
});
```





## 参考サイト
[【PostgreSQL入門】初心者OK！PostgreSQLでデータベースの基礎を学んでみよう【APIの構築まで】](https://www.youtube.com/watch?v=SyVw6Vjsf8E)
[PostgreSQLとは？特徴や最新バージョンの機能を紹介！](https://products.sint.co.jp/siob/blog/postgresql)
[【Node.js】nodemonを使って、サーバーを自動で更新する方法](https://www.azukipan.com/posts/nodejs-nodemon/)