Akses dari Bahasa Lain

Peta driver SQLite untuk Java, Go, dan Node.js.

Daftar isi

SQLite dapat dipakai dari hampir semua bahasa pemrograman karena pustaka aslinya berukuran kecil, bebas lisensi, dan tidak menuntut proses server. Topik ini memetakan driver, yaitu pustaka penghubung yang membawa SQLite ke tiap bahasa, untuk Java, Go, Node.js, dan C#, beserta kaidah memilihnya. Satu contoh Node.js dijalankan sungguhan dengan modul node:sqlite bawaan, sedangkan contoh Java dan Go disajikan sebagai potongan untuk dibaca karena runtime keduanya tidak tersedia pada lingkungan contoh jalur ini.

Peta driver untuk tiap bahasa#

Driver untuk umumnya bekerja dengan salah satu dari dua cara, yaitu membungkus pustaka C resmi SQLite atau menulis ulang pembacaan format berkasnya dalam bahasa pemrograman itu sendiri. Kedua pendekatan menghasilkan basis data yang sama persis, tetapi keduanya berbeda dalam proses pemasangan dan kompilasinya. Tabel berikut merangkum pilihan yang paling sering dipakai pada empat bahasa tersebut.

BahasaDriverKarakter utama
Javasqlite-jdbc (proyek xerial)satu berkas JAR dengan pustaka asli terbundel
Gomattn/go-sqlite3pembungkus cgo atas pustaka C, paling banyak dipakai
Gomodernc.org/sqlitemurni Go, tanpa cgo
Node.jsnode:sqlitebawaan sejak Node.js versi 22, tanpa pemasangan
Node.jsbetter-sqlite3API sinkron yang matang, dipasang lewat npm
C#Microsoft.Data.Sqliteresmi dari Microsoft, dipasang lewat NuGet

Enam entri di atas bukan daftar tunggal karena setiap ekosistem memiliki pilihan lain, tetapi keenamnya mencakup kebutuhan sebagian besar proyek baru. Nama driver dipakai apa adanya dalam bahasa Inggris sebagaimana dokumentasi resminya, dan semua driver pada tabel mengikuti konvensi query berparameter masing-masing bahasa. Pola pemakaiannya pun serupa satu sama lain, yaitu membuka koneksi, menyiapkan pernyataan, memasok nilai lewat placeholder, lalu membaca hasilnya.

Kaidah memilih driver#

Pemilihan driver mengikuti kebutuhan penyebaran aplikasi lebih dahulu, baru kemudian seleranya. Untuk Java, sqlite-jdbc menjadi pilihan lazim karena pustaka asli sudah terbundel di dalam satu JAR, sehingga proyek tidak perlu mengompilasi SQLite sendiri. Untuk Go, mattn/go-sqlite3 menuntut toolchain C melalui cgo, sedangkan modernc.org/sqlite menghindari ketergantungan itu sehingga kompilasi silang dan build tanpa C berjalan lebih mudah. Perbedaan ini menentukan ketika aplikasi harus dibangun untuk banyak arsitektur sekaligus.

Pada Node.js, modul node:sqlite dipilih bila versi runtime sudah 22 atau lebih baru dan proyek ingin bebas dependensi tambahan, sedangkan better-sqlite3 dipilih bila proyek membutuhkan fitur yang lebih lengkap atau versi Node yang lebih tua. Untuk C#, Microsoft.Data.Sqlite menjadi pilihan bawaan karena dikembangkan bersama ekosistem .NET dan terdokumentasi resmi. Faktor terakhir yang layak ditimbang adalah pemeliharaan proyek drivernya, karena lapisan penghubung ini jarang disentuh lagi setelah terpasang, sehingga rilis yang teratur dan dokumentasi yang jelas bernilai jangka panjang. Apa pun pilihannya, kebiasaan pemrogramannya sama, sehingga perpindahan antar-driver pada satu bahasa jarang menuntut penulisan ulang logika query.

Node.js dengan node:sqlite#

Modul node:sqlite diekspor dari node:sqlite dan menyediakan class DatabaseSync untuk koneksi sinkron. Metode exec menjalankan pernyataan tanpa hasil baris, metode prepare menghasilkan pernyataan yang sudah dikompilasi, sedangkan metode run, get, dan all mengeksekusinya untuk penulisan, satu baris, dan seluruh baris. Pernyataan hasil prepare dapat dijalankan berulang dengan nilai yang berbeda, sehingga contoh berikut menyisipkan dua buku lewat satu pernyataan sisip yang sama. Contoh berikut tersimpan sebagai berkas utuh akses.js pada bundle topik ini dan dijalankan dengan node akses.js.

js akses.js
const { DatabaseSync } = require("node:sqlite");

const db = new DatabaseSync(":memory:");
db.exec(
  "CREATE TABLE buku ("
  + "id INTEGER PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL)"
);

const sisip = db.prepare("INSERT INTO buku (judul, penulis) VALUES (?, ?)");
sisip.run("Kisah Kota Tua", "Sari Wulandari");
sisip.run("Anak Sungai", "Rahmat Hidayat");

const cari = db.prepare("SELECT id, judul FROM buku WHERE penulis = ?");
console.log(cari.get("Sari Wulandari"));
console.log(cari.all("Rahmat Hidayat"));

db.close();
text Keluaran
[Object: null prototype] { id: 1, judul: 'Kisah Kota Tua' }
[ [Object: null prototype] { id: 2, judul: 'Anak Sungai' } ]

Metode get mengembalikan satu baris berupa objek yang propertinya bernama sama dengan kolomnya, sedangkan all mengembalikan array berisi objek semacam itu. Selain baris, metode run juga mengembalikan objek berisi changes untuk jumlah baris terdampak dan lastInsertRowid untuk id baris yang baru disisipkan. Label [Object: null prototype] pada keluaran menunjukkan bahwa objek baris dibuat tanpa prototipe, yaitu tanpa warisan properti bawaan JavaScript, sehingga nilainya murni data dari kolom. Placeholder ? pada pernyataan cari menerima nilai sebagai argumen terpisah, persis pola yang dipakai modul sqlite3 pada Python.

Java dan Go#

Kedua bahasa berikut dieksekusi melalui antarmuka baku masing-masing, yaitu JDBC untuk Java dan paket database/sql untuk Go. Pola kodenya sama dengan contoh Node.js, hanya penamaannya yang mengikuti konvensi bahasanya. Contoh-contoh ini tidak dijalankan karena runtime Java dan Go tidak tersedia pada lingkungan contoh, sehingga keduanya disajikan tanpa blok keluaran.

java Contoh: query berparameter lewat JDBC
// tidak-dijalankan
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AksesBuku {
  public static void main(String[] args) throws Exception {
    try (Connection koneksi = DriverManager.getConnection("jdbc:sqlite:perpustakaan.db")) {
      PreparedStatement cari = koneksi.prepareStatement(
          "SELECT judul FROM buku WHERE penulis = ?");
      cari.setString(1, "Sari Wulandari");
      ResultSet hasil = cari.executeQuery();
      while (hasil.next()) {
        System.out.println(hasil.getString("judul"));
      }
    }
  }
}
go Contoh: query berparameter lewat database/sql
// tidak-dijalankan
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    db, err := sql.Open("sqlite3", "perpustakaan.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()
    rows, err := db.Query("SELECT judul FROM buku WHERE penulis = ?", "Sari Wulandari")
    if err != nil {
        panic(err)
    }
    defer rows.Close()
    for rows.Next() {
        var judul string
        rows.Scan(&judul)
        fmt.Println(judul)
    }
}

Pada contoh Java, metode setString mengisi placeholder pertama dengan nilai string, dan try-with-resources menutup koneksi secara otomatis. Keberadaan pernyataan yang sudah dikompilasi juga membuat query yang sama dapat dijalankan ulang dengan nilai berbeda tanpa diparsing lagi. Pada contoh Go, impor dengan garis bawah hanya mendaftarkan driver sqlite3 ke paket database/sql, sedangkan nilai placeholder dikirim sebagai argumen variadik pada Query. Konvensi Go menuntut setiap error diperiksa segera setelah pemanggilannya, sehingga sql.Open dan Query masing-masing diikuti pengujian err, sedangkan Java melaporkan kegagalan lewat pengecualian yang dinyatakan pada tanda tangan metodenya. Kedua pola itu menegaskan pesan yang sama, yaitu nilai selalu dikirim terpisah dari teks query di semua bahasa.

Ringkasan#

  • Driver SQLite membungkus pustaka C resmi atau menulis ulang pembacaan format berkasnya dalam bahasa pemrograman tujuan.
  • sqlite-jdbc melayani Java dalam satu JAR, Go memilih antara mattn/go-sqlite3 dengan cgo dan modernc.org/sqlite tanpa cgo, sedangkan C# memakai Microsoft.Data.Sqlite.
  • node:sqlite tersedia bawaan sejak Node.js 22 dengan DatabaseSync beserta method prepare, run, get, dan all.
  • Semua driver mengirim nilai lewat placeholder yang terpisah dari teks query, sehingga pola query berparameter berlaku sama di semua bahasa.

Referensi#