Menggunakan SQLite pada Nodejs

Pada tutorial sebelumnya, kita sudah mencoba menggunakan database MySQL pada Nodejs.

Sekarang kita akan mencoba menggunakan SQLite pada Nodejs.

Apa bedanya SQLite dengan MySQL?

SQLite merupakan database RDBMS (Relational Database Management System) yang tidak membutuhkan server.

Sedangkan MySQL membutuhkan server.

SQLite menyimpan database pada file .db atau .sqlite3.

SQLite biasanya digunakan pada aplikasi desktop dan mobile. Sedangkan MySQL biasanya digunakan pada aplikasi web.

Jika kamu baru pertama mendengar SQLite, saya sarankan untuk membaca “tutorial SQLite untuk pemula” terlebih dahulu.

Setelah itu, silahkan lanjut ke tutorial ini.

Baiklah, langsung saja kita mulai…

Peralatan dan Modul yang Dibutuhkan

Pertama, pastikan sqlite3 sudah terinstal di komputermu. Karena sqlite3 akan kita gunakan untuk membuat database.

Silahkan instal dengan perintah berikut:

sudo apt install sqlite3

Tekan y terus Enter, lalu tunggu sampai prosesnya selesai.

Instalasi SQLite di Ubuntu

Kedua, kita membutuhkan modul sqlite3 pada nodejs untuk menghubungkan SQLite dengan Nodejs.

Silahkan buat project baru dengan membuat direktori bernama nodejs-sqlite.

mkdir nodejs-sqlite
cd nodejs-sqlite

Setelah itu, jalankan perintah berikut untuk menginstal modul sqlite3.

npm install sqlite3

Tunggu sampai prosesnya selesai…

Instalasi modul SQLite3

Berikutnya kita akan membuat database baru.

Membuat Database SQLite

Database SQLite tersimpan dalam file .db, kita harus membuat file ini menggunakan perintah sqlite3.

Sebelum melakukan itu, silahkan buat direktori baru bernama db di dalam direktori nodejs-sqlite.

mkdir db

Setelah itu ketik perintah berikut untuk membuat database baru:

sqlite3 db/playlist.db

Kita akan membuat database bernama playlist.db yang nanti isinya ada tabel favorite_songs untuk menyimpan daftar lagu favorit.

Membuat tabel SQLite

Tampilan di atas artinya: Saat ini kita sedang berada di dalam shell SQLite.

Silahkan keluar dari shell tersebut, dengan menekan tombol Ctrl+d.

Setelah itu, untuk memastikan file database berhasil dibuat, ketik perintah berikut.

tree db

Jika ada file baru bernama playlis.db, maka artinya: pembuatan database berhasil.

Database playlist.db

Berikutnya, kita akan menghubungkan SQLite dengan Node.

Membuat Koneksi Nodejs dengan SQLite

Silahkan buat file baru bernama db_config.js, kemudian isi dengan kode berikut:

const sqlite3 = require('sqlite3').verbose();
const dbFile = __dirname + "/db/playlist.db";

let db = new sqlite3.Database(dbFile, sqlite3.OPEN_READWRITE, (err) => {
    if(err) throw err;
    console.log("Koneksi ke database berhasil!");
});

module.exports = db;

Penjelasan:

Pertama kita mengimpor modul sqlite3 dengan mode verbose() agar dapat menampilkan pesan error.

const sqlite3 = require('sqlite3').verbose();

Lalu kita menentukan alamat file databasenya:

const dbFile = __dirname + "/db/playlist.db";

Setelah itu, kita mencoba melakukan koneksi ke database dengan membuat objek db dari class sqlite3.Database().

Ada tiga parameter yang kita berikan pada class ini:

  1. Alamat path file databasenya (dbFile);
  2. Mode yang digunakan (sqlite3.OPEN_READWRITE);
  3. Fungsi callback yang akan dieksekusi.

Terdapat tiga macam mode yang bisa berikan untuk parameter yang ke-2:

  1. sqlite3.OPEN_READONLY: buka database untuk dibaca saja (read-only).
  2. sqlite3.OPEN_READWRITE: buka database untuk dibaca dan ditulis.
  3. sqlite3.OPEN_CREATE: buka database dan buat database baru apabila belum ada.

Kemudian pada baris terakhir, kita mengekspor objek db agar nanti bisa diimpor dari script lainnya.

module.exports = db;

Oke, sekarang coba eksekusi db_config.js.

Koneksi Nodejs dengan SQLite

Ini artinya kita sudah berhasil terhubung dengan database playlist.db.

Kalau gagal bagaimana?

Biasanya kalau gagal akan tampil seperti ini:

Koneksi Nodejs dengan SQLite

Ini gagal yang disebabkan karena nama databasenya salah atau databasenya belum ada.

Berikutnya kita akan membuat tabel, sebelumnya silahkan hapus baris ini:

console.log("Koneksi ke database berhasil!");

Agar tidak mengganggu.

Membuat Tabel SQLite

Kita akan membuat tabel melalui Nodejs.

Silahkan buat file baru bernama create_table.js, kemudian isi dengan kode berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = `CREATE TABLE IF NOT EXISTS favorite_songs(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title VARCHAR(64),
        artist VARCHAR(64)
    );`;
    db.run(sql, (err) => {
        if(err) throw err;
        console.log("Table created");
    });

});

db.close();

Penjelasan:

Sebelum kita dapat mengeksekusi sebuah query, kita harus memanggil fungsi db.serialize() terlebih dahulu.

db.serialize(function(){
    // ...
}

Fungsi ini memiliki parameter berupa fungsi callback. Nanti di dalam fungsi callback inilah kita akan membuat dan mengeksekusi query.

Pada kode SQL, kita akan membuat tabel dengan nama favorite_songs, kemudian di dalamnya kita membuat tiga kolom:

  1. id untuk nenampung id. Kolom ini akan menjadi PRIMARY KEY dan akan disi otomatis dengan AUTOINCREMENT.
  2. title untuk menyimpan judul lagu, panjangnya 64 karakter dengan tipe string atau varchar.
  3. artist untuk menyimpan nama artis, panjangnya 64 karakter dengan tipe string atau varchar.

Lalu kita eksekusi sql untuk pembuatan tabel dengan fungsi db.run().

Nanti pesan "Table create" akan ditampilkan, apabila eksekusi query berhasil.

Terakhir…

Kita menutup database dengan fungsi db.close(), karena koneksi sudah tidak digunakan lagi.

Oke, kalau begitu mari kita coba jalankan program create_table.js.

Membuat tabel SQLite

Untuk memastikan, coba masuk ke shell SQLite.

Ikuti perintah berikut:

sqlite3 db/playlis.db # masuk ke shell
.tables
.schema favorite_songs

Jika hasilnya seperti ini…

Dump tabel SQLite

…maka kita sudah berhasil membuat tabel.

Berikutnya kita akan mengisi data ke tabel.

Menambahkan Data ke SQLite

Insert data ke tabel SQLite, caranya tidak jauh berbeda dengan pembuatan tabel.

Langkah-langkanya:

  1. Eksekusi db.serialize();
  2. lalu di dalamnya buat query;
  3. eksekusi query dengan db.run().

Mari kita coba…

Silahkan buat file baru dengan nama insert.js dan isi sebagai berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = "INSERT INTO favorite_songs (title, artist) VALUES ('First Love', 'Utada Hikaru')";
    db.run(sql, (err) => {
        if(err) throw err;
        console.log("1 record inserted");
    });

});

db.close();

Setelah itu, coba eksekusi insert.js.

Insert data ke database SQLite

Berhasil!

Kita baru hanya menambahkan satu data saja. Berikutnya kita akan coba menambahkan lebih banyak data.

Bagaimana caranya?

Caranya hampir sama.

Tapi saat eksekusi query, kita harus menggunakan perulangan. Karena ada banyak data yang akan ditambahkan.

Mari kita coba…

Buatlah file baru bernama insert_multi.js, kemudian isi dengan kode berikut:

let db = require('./db_config');

db.serialize(function(){
    let sql = `INSERT INTO favorite_songs (title, artist) VALUES (?,?)`;
    let stmt = db.prepare(sql);
    var songs = [
        ["Dear God", "Avenged Sevenfold"],
        ["No Matter", "Akon"],
        ["No Wonem No Cry", "Bob Marley"],
        ["Umbrella", "Rihana"]
    ];

    songs.forEach((song) => {
        stmt.run(song, (err) => {
            if (err) throw err;
        });
    });
    console.log(`${songs.length} record inserted`);
    stmt.finalize();
    
});

db.close();

Coba eksekusi insert_multi.js.

Insert banyak file ke sqlite dengan nodejs

Berhasil!

Perhatikan kode program di atas…

Karena kita akan mengeksekusi banyak query, maka kita gunakan statement stmt.

let stmt = db.prepare(sql);

Ini biasanya digunakan untuk transaction.

Lalu setelah itu, kita buat perulangan berdasarkan panjang array dari songs dengan menggunakan method forEach().

songs.forEach((song) => {
    stmt.run(song, (err) => {
        if (err) throw err;
    });
});

Di dalam perulangan, kita mengeksekusi query dengan memanggil fungsi run() dari objek stmt.

Lalu kita berikan parameter song agar tanda tanya yang ada di dalam SQL terisi dengan data yang ada di dalam array.

Terakhir…

Kita tutup transaction dengan fungsi stmt.finalize() dan menutup database dengan db.close().

Membaca Data dari SQLite

Khusus untuk membaca data, method atau fungsi yang digunakan berbeda dengan yang lainnya.

Ada dua method yang bisa digunakan:

  1. db.all() untuk mengambil semua data dari hasil query;
  2. db.get() untuk mengambil satu data dari hasil query;

Method db.all() akan menghasilkan sebuah array yang berisi objek dari masing-masing row atau data.

Sedangkan method db.get() akan menghasilkan sebuah objek dari data.

Untuk lebih jelasnya…

…mari kita coba.

Buatlah file baru bernama select.js, kemudian isi dengan kode berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = "SELECT * FROM favorite_songs";
    db.all(sql, (err, rows) => {
        if (err) throw err;

        if(rows){
            // cetak isi rows
            rows.forEach(song => {
                console.log(`[${song.id}] ${song.artist} - ${song.title}`);
            });
        } else {
            console.log("tidak ada data/hasil");
        }
    });

});

db.close();

Hasilnya:

Membaca data dari sqlite

Perhtaikan kode berikut…

db.all(sql, (err, rows) => {
    if (err) throw err;

    if(rows.length > 1){
        // cetak isi rows
        rows.forEach(song => {
            console.log(`[${song.id}] ${song.artist} - ${song.title}`);
        });
    } else {
        console.log("tidak ada data/hasil");
    }
});

Hasil query akan disimpan dalam variabel rows, variabel ini akan berisi sebuah array.

Karena itu, kita menggunakan method forEach() untuk membuat perulangan dan menampilkan isinya.

Berikutnya kita akan coba mengambil satu data saja…

Bagaimana caranya?

Caranya sama, kita tinggal ubah SQL dan fungsi db.all() menjadi db.get().

Mari kita coba…

Buatlah file baru bernama select_one.js, kemudian isi dengan kode berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = "SELECT * FROM favorite_songs WHERE title=?";
    songTitle = "Umbrella";

    db.get(sql, [songTitle], (err, row) => {
        if (err) throw err;

        if(row){
            // cetak isi row
            console.log(`[${row.id}] ${row.artist} - ${row.title}`);
        } else {
            console.log("Tidak ada data/hasil");
        }
    });

});

db.close();

Hasilnya:

Membaca satu data dari tabel sqlite

Update Data SQLite

Ada kesalahan pada judul lagu yang kita buat. Pada Akon - No Matter, seharusnya yang benar: Akon - Don't Matter.

Kita harus merubahnya.

Caranya?

Caranya sama seperti insert data, tapi SQL-nya berbeda.

Mari kita coba…

Buatlah sebuah file baru dengan nama update.js, kemudian isi dengan kode berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = `UPDATE favorite_songs 
        SET title="Don't Matter"
        WHERE id=?`;

    let songId = '43';

    db.run(sql, [songId], (err) => {
        if (!err) console.log("1 record updated");
    });

});

db.close();

Setelah itu coba eksekusi:

Update data SQLite

Perhatikan kode di atas…

Kita memberikan nilai '43' untuk variabel songId, karena id dari data yang akan kita edit adalah 43.

Silahkan sesuaikan dengan id data yang ingin kamu ubah.

Hapus Data SQLite dengan Nodejs

Sama seperti ubah data, penghapusan data juga membutuhkan id untuk menentukan data mana yang akan dihapus.

Mari kita coba…

Buatlah file baru dengan nama delete.js, kemudian isi dengan kode berikut:

const db = require('./db_config');

db.serialize(function(){

    let sql = `DELETE FROM favorite_songs WHERE id=?`;
    let songId = "59";

    db.run(sql, [songId], (err) => {
        if (!err) console.log("Data deleted");
    });

});

db.close();

Hasilnya:

Hapus data tertentu

Pada contoh di atas, kita menghapus data yang ber-id 59, yaitu: Rihanna - Umbrella.

Lalu… Bagaimana caranya menghapus semua data dari tabel?

Caranya gampang.

Tinggal hapus WHERE pada SQL, maka semua data pada tabel akan terhapus.

Contoh: delete_all.js

const db = require('./db_config');

db.serialize(function(){

    let sql = `DELETE FROM favorite_songs`;

    db.run(sql, (err) => {
        if (!err) console.log("All data deleted");
    });

});

db.close();

Maka hasilnya:

Menghapus semua data dari tabel

Apa Selanjutnya?

Sejauh ini kita sudah berhasil melakukan operasi CRUD (Create, Read, Update, dan Delete) pada database SQLite.

Masih banyak query yang belum dicoba, seperti query untuk pencarian, query join, query limit, dan sebagainya.

…dan juga kita belum mencoba menerapkannya pada kasus tertentu.

Karena itu, teruslah bereksperimen.

Selamat belajar.