Module 3: SQLite Database සැකසීම

අපේ application එකේ දත්ත ගබඩා කිරීමට අවශ්‍ය database එක සහ වගු (tables) නිර්මාණය කරගනිමු.

1. SQLite Library එක Install කිරීම

Next.js (Node.js) project එකක සිට SQLite database එකක් සමඟ සම්බන්ධ වීමට අපට library එකක් අවශ්‍ය වේ. මේ සඳහා වඩාත්ම ජනප්‍රිය සහ වේගවත් library එකක් වන better-sqlite3 අපි භාවිතා කරමු.

ඔබේ project's root directory එකේ terminal එක විවෘත කර (VS Code එකේ terminal එක open කරගන්න), පහත command එක run කරන්න.

npm install better-sqlite3

මෙමගින් better-sqlite3 library එක අපේ project එකට install වන අතර, එය package.json file එකේ dependencies වලටද එකතු වේ.


2. Database File එක සහ Connection File එක සෑදීම

SQLite යනු file-based database එකක් නිසා අපට database server එකක් අවශ්‍ය නැත. අපේ සියලුම දත්ත (users, notes) තනි file එකක ගබඩා වේ.

➡️ Database Management File එක සෑදීම

Database එකට connect වීමට සහ queries run කිරීමට අවශ්‍ය කේත එකම තැනක තබා ගැනීම හොඳ පුරුද්දකි. ඒ සඳහා, project එකේ root directory එකේ lib නමින් folder එකක් සාදන්න. (app folder එකට வெளியே). ඉන්පසු, ඒ lib folder එක තුළ db.js නමින් file එකක් සාදන්න.

ඔබේ project structure එක දැන් මෙසේ දිස්විය යුතුය:

notes-app/
├── app/
├── lib/
│   └── db.js
├── node_modules/
└── package.json
➡️ Connection කේතය ලිවීම

දැන් lib/db.js file එකට පහත කේතය ඇතුළත් කරන්න.

import Database from 'better-sqlite3';

// Create a new database connection.
// This will create the 'notes.db' file if it doesn't exist.
const db = new Database('notes.db', { verbose: console.log });

// Function to initialize the database and create tables
export function initDb() {
    // Run SQL commands to create tables if they don't exist
    db.exec(`
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL UNIQUE,
            password_hash TEXT NOT NULL
        );
        
        CREATE TABLE IF NOT EXISTS notes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            content TEXT NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            user_id INTEGER,
            FOREIGN KEY (user_id) REFERENCES users (id)
        );
    `);
    console.log("Database initialized.");
}

// Export the database connection object to be used in other files
export default db;

මෙම file එක run කළ විට, better-sqlite3 library එක project's root එකේ notes.db නමින් file එකක් සාදනු ඇත. ඒ file එක තමයි අපේ database එක.


3. Migration Script එකක් මගින් Tables සෑදීම

Database Migration යනු කුමක්ද?
Migration යනු database schema එකේ (එනම් tables සහ columns වල ව්‍යුහය) සිදුවන වෙනස්කම් version control කරන ක්‍රමයකි. සරලවම කිවහොත්, අපේ tables සෑදීමට, ඒවාට columns එකතු කිරීමට හෝ වෙනස් කිරීමට අදාළ SQL කේත, පිළිවෙලකට scripts ලෙස තබා ගැනීමයි. මෙය project එක කළමනාකරණයට ඉතාමත් පහසු වේ.

➡️ අපේ Tables වල ව්‍යුහය

අපට tables දෙකක් අවශ්‍යයි:

  1. users: පරිශීලකයින්ගේ තොරතුරු ගබඩා කිරීමට.
    • id: Primary Key (Unique identifier)
    • username: User ගේ නම (Unique විය යුතුයි)
    • password_hash: Hash කරන ලද password එක
  2. notes: සටහන් ගබඩා කිරීමට.
    • id: Primary Key
    • title: සටහනේ මාතෘකාව
    • content: සටහනේ අන්තර්ගතය
    • created_at: සටහන සෑදූ වේලාව
    • user_id: සටහන අයිති user ගේ ID එක (මෙය users table එකේ id එකට සම්බන්ධ වේ - Foreign Key)
➡️ Migration Script එක Run කිරීම

අපි ඉහත lib/db.js file එකේ initDb නමින් function එකක් සෑදුවෙමු. එහි table සෑදීමට අවශ්‍ය SQL කේතය දැනටමත් අඩංගුය. දැන් අපට අවශ්‍ය වන්නේ ඒ function එක run කරන script එකක් සෑදීමයි.

Project එකේ root directory එකේ init-db.js නමින් අලුත් file එකක් සාදන්න. (app හෝ lib folder එක තුළ නොවේ).

එම init-db.js file එකට පහත කේතය ඇතුළත් කරන්න.

// This is a simple script to initialize the database.
// We import the initDb function from our db library.
const { initDb } = require('./lib/db.js');

// Call the function to run the CREATE TABLE statements.
initDb();

දැන්, terminal එක විවෘත කර පහත command එක run කරන්න.

node init-db.js

ඔබට "Database initialized." යන පණිවිඩය terminal එකේ පෙනෙනු ඇත. ඒ සමඟම, project එකේ root එකේ notes.db නමින් file එකක් සෑදී ඇති බව ඔබට පෙනෙනු ඇත. අපේ tables දෙක දැන් ඒ database එක තුළ සාර්ථකව නිර්මාණය වී ඇත!