Ce face node:sqlite (DatabaseSync)
Modulul node:sqlite aduce SQLite direct în Node.js: o bază de date întreagă într-un singur fișier, fără server separat. Este potrivită pentru aplicații mici, unelte de linie de comandă, cache-uri și teste. Stadiul lui în Node.js 26 este candidat de lansare (stabilitate 1.2): API-ul este aproape final, dar încă poate primi schimbări mici.
new DatabaseSync(cale) deschide (sau creează) fișierul; ":memory:" face o bază doar în memorie. db.exec(sql) rulează una sau mai multe comenzi fără rezultat (creare de tabele). Pentru date variabile folosești interogări pregătite: db.prepare(sql) cu ? sau parametri cu nume (:oras), apoi run() (modificări; întoarce changes și lastInsertRowid), get() (primul rând) sau all() (toate rândurile, ca obiecte).
Toate operațiile sunt sincrone (de aici numele DatabaseSync): sunt rapide pentru o bază locală, dar blochează firul pe durata interogării. Închide baza cu db.close().
Parametri
| Parametru | Descriere |
|---|---|
new DatabaseSync(cale, [opțiuni]) |
Deschide baza; ":memory:" pentru o bază temporară. |
db.exec(sql) |
Rulează comenzi SQL fără parametri și fără rezultat. |
db.prepare(sql) |
Pregătește o interogare cu parametri (?, :nume). |
stmt.run(...) |
Execută; întoarce { changes, lastInsertRowid }. |
stmt.get(...) / stmt.all(...) |
Primul rând / toate rândurile, ca obiecte. |
db.close() |
Închide baza. |
Ce returnează
Rândurile sunt obiecte cu numele coloanelor drept chei. Sunt create fără prototip, de aceea console.log le afișează cu eticheta [Object: null prototype]; le folosești ca pe orice obiect.
Exemple
Exemplul 1: Tabel, inserări și interogări
import { DatabaseSync } from "node:sqlite";
const db = new DatabaseSync(":memory:");
db.exec(`
CREATE TABLE elevi (id INTEGER PRIMARY KEY, nume TEXT NOT NULL, oras TEXT, nota REAL);
`);
const adauga = db.prepare("INSERT INTO elevi (nume, oras, nota) VALUES (?, ?, ?)");
for (const [nume, oras, nota] of [["Ana", "Iași", 9.5], ["Ion", "Cluj", 7], ["Maria", "Iași", 10]]) {
adauga.run(nume, oras, nota);
}
console.log(adauga.run("Vlad", "Arad", 8.25));
const dinOras = db.prepare("SELECT nume, nota FROM elevi WHERE oras = :oras ORDER BY nota DESC");
console.log(dinOras.all({ oras: "Iași" }));
console.log(db.prepare("SELECT COUNT(*) AS total, AVG(nota) AS medie FROM elevi").get());
db.close();
Rezultat
{ changes: 1, lastInsertRowid: 4 }
[
[Object: null prototype] { nume: 'Maria', nota: 10 },
[Object: null prototype] { nume: 'Ana', nota: 9.5 }
]
[Object: null prototype] { total: 4, medie: 8.6875 }
Exemplul 2: Baza într-un fișier, cu tranzacție
Datele rămân în magazin.db după închidere. Tranzacția face ca toate inserările să reușească împreună sau deloc.
import { DatabaseSync } from "node:sqlite";
let db = new DatabaseSync("magazin.db");
db.exec("CREATE TABLE IF NOT EXISTS produse (nume TEXT UNIQUE, pret REAL)");
const insert = db.prepare("INSERT INTO produse VALUES (?, ?)");
try {
db.exec("BEGIN");
insert.run("mere", 4.5);
insert.run("pere", 6);
insert.run("mere", 5); // încalcă UNIQUE
db.exec("COMMIT");
} catch (eroare) {
db.exec("ROLLBACK");
console.log("Anulat:", eroare.message);
}
insert.run("prune", 7.2);
db.close();
db = new DatabaseSync("magazin.db");
console.log(db.prepare("SELECT * FROM produse").all());
db.close();
Rezultat
Anulat: UNIQUE constraint failed: produse.nume
[ [Object: null prototype] { nume: 'prune', pret: 7.2 } ]
Greșeli frecvente
- Construiești interogarea cu text:
db.exec(`... WHERE nume = '${nume}'`). Un nume caO'Brienstrică interogarea, iar unul răuvoitor poate șterge date (injectare SQL). Foloseștepreparecu parametri. - Folosești
node:sqlitepentru un site cu mulți utilizatori care scriu simultan: SQLite permite un singur scriitor odată, iar operațiile sincrone blochează serverul. Pentru asta alege PostgreSQL sau MySQL. - Aștepți
true/falsela citire: SQLite nu are tip boolean, deci primești1și0.
Comenzi înrudite
http.createServer: Pornește un server web cu modulul de bază node:http: primești cererea (req) și trimiți răspunsul (res).fs.stat / fs.access / existsSync: Află informații despre un fișier (tip, mărime, date), verifică dacă există și dacă poate fi citit sau scris.worker_threads (Worker): Rulează cod JavaScript în fire de execuție separate, ca un calcul greu să nu blocheze restul programului.