💡

ONSEN GOODS開発記録 No.2

に公開

前回の続き/データベーステーブル設計

前回の続きから...
hot_springsの定義が不十分だったので、以下のように設計。

続いて各温泉に対するユーザーの評価・コメントを保存するratingsテーブルを設計していく。

これでデータベース設計はひとまず完了。

ディレクトリを構築

今回はAPI開発にあまり慣れていないため、backendから作っていく。

Bash
mkdir backend
cd backend

続けてNode.jsプロジェクトを初期化する。

Bash
npm init -y

今回使うのはexpress, SQLite。 インストールしていく。
ここで、AIにcorsというもののインストールも進められた。調べてみるとフロントとバックが異なるポートやドメインで動作する際に必要となるものらしい(通信・セキュリティ系)。※用勉強
まとめてインストール。

Bash
npm install express sqlite3 cors 

※sqlite3はNode.jsからSQLiteを操作するためのライブラリ

データベース構築

データベースファイルの作成・初期化

dbフォルダを作成。
dbフォルダの中にdatabase.jsファイルを作成。

/backend/db/database.js
const sqlite3 = require('sqlite3').verbose();
const path = require('path');

//データベースファイルのファイルパスを定義
const dbPath = path.resolve(__dirname, 'onsen.db');

//データベースに接続
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('データベース接続エラー:', err.message);
  } else {
    console.log('データベースに接続しました:', dbPath);
    //データベースの初期化とテーブル作成
    db.serialize(() => {
      //hot_springsテーブル作成
      db.run(`
        CREATE TABLE IF NOT EXISTS hot_springs (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT NOT NULL,
          location TEXT NOT NULL,
          rating REAL NOT NULL DEFAULT 0.0,
          description TEXT,
          image_url TEXT,
          facilities TEXT, -- 設備情報("サウナ,露天風呂,水風呂")
          created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
          updated_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
        )
      `, (err) => {
        if (err) {
          console.error('hot_springsテーブル作成エラー:', err.message);
        } else {
          console.log('hot_springsテーブルが準備できました。');
          //書記データの挿入 (IF IGNORE は既にあれば挿入しない)
          //画像URLはダミーのプレースホルダーサービスを使用
          db.run(`INSERT OR IGNORE INTO hot_springs (id, name, location, rating, description, image_url, facilities) VALUES
            (1, 'せせらぎの湯 花水木', '鹿児島県日置市伊集院町大田2768', 4.5, 'だいぶ山奥にあって行きづらいが、露天風呂が最高。', 'https://via.placeholder.com/300x200/FF5733/FFFFFF?text=Kusatsu', '露天風呂,サウナ,水ぶろ,外気浴' ),
            (2, '硫黄谷温泉 霧島ホテル' '鹿児島県霧島市牧園町高千穂3948', 4.9, '鹿児島で最大の温泉、規格外。' 'https://via.placeholder.com/300x200/33FF57/FFFFFF?text=Hakone', '露天風呂,サウナ,水風呂,外気浴'),
            (3, '芦刈温泉', '鹿児島県鹿児島市若葉町45-1', 4.7,'鹿児島市内から気軽に行ける温泉、入っていて楽しい。', 'https://via.placeholder.com/300x200/3357FF/FFFFFF?text=Noboribetsu', '露天風呂,サウナ,水風呂')
          `);
        }
      });

      //ratings テーブルの作成
      db.run(`
        CREATE TABLE IF NOT EXISTS ratings(
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          onsen_id INTEGER NOT NULL,
          rating_value REAL NOT NULL,
          comment TEXT,
          created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
          FOREIGN KEY (onsen_id) REFERENCES hot_springs(id) ON DELETE CASCADE
        )
      `,(err) => {
        if (err) {
          console.error('ratingsテーブル作成エラー:', err.message);
        } else {
          console.log('ratingsテーブルが準備できました。');
          // rating初期データ
          db.run(`INSERT OR IGNORE INTO ratings (id, onsen_id, rating_value, comment) VALUES
            (1, 1, 5.0, '最高のお湯でした。'),
            (2, 2, 4.5, '中央にある噴水は圧巻でした。'),
            (3, 3, 4.0, 'サウナと水風呂が最高でした。')
          `);
        }
      });
      
    });
  }
});

module.exports = db;

hot_springsratingにはじめは初期値を入れていなかったが、入れないと後でエラーになる可能性があるらしいので適当な数字を入れた。いま思えば0.0と入れておけばよかった。
ちなみに画像はダミー。これは後からダミー画像を生成してくれる奴に変えようと思う。(https://via.placeholder.com/300x200)

GitHubにコミット

今日はここまでにして、今回の開発ではgitでしっかり進捗を管理していこうと思う。
.gitignoreファイルを作成し、無視するファイルたちを記述。この記述が甘いせいで前回大失敗したので、AIにチェックしてもらいながら慎重にしていく。

/.gitignore# Node.js 関連
**/node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.env

# SQLite データベースファイル
**/*.db
*.sqlite3

# OS Generated Files
.DS_Store
Thumbs.db

次にコミットしていく。

Bash
git add .

変更をコミット

Bash
git commit -m "feat: Initial project setup with monorepo structure"

GitHubでリポジトリを作成し、連携させる。以下のコマンドはGitHubにも表示されるので見つけてコピペしよう。

Bash
git remote add origin <あなたのGitHubリポジトリのURL>
git branch -M main
git push -u origin main

これで完了。
今日はやることが多くて疲れた。
to be continued =>

Discussion