Introduction
SQLite est une base de données relationnelle légère, serverless et embarquée, idéale pour les applications Node.js de petite à moyenne envergure. Contrairement à PostgreSQL ou MySQL qui nécessitent un serveur dédié, SQLite stocke tout dans un seul fichier, ce qui simplifie le déploiement et réduit les coûts. En 2026, avec la montée des apps edge et serverless, SQLite excelle pour les prototypes rapides, les apps mobiles hybrides ou les outils CLI.
Ce tutoriel beginner vous guide pour intégrer SQLite via better-sqlite3, une lib moderne synchrone et performante. Vous apprendrez à créer une DB, implémenter des opérations CRUD complètes, et gérer des transactions. À la fin, vous aurez un script fonctionnel prêt à bookmarker. Chaque étape inclut du code copier-collable, testé sur Node.js 20+. (128 mots)
Prérequis
- Node.js 20+ installé (téléchargez ici)
- Un terminal (VS Code intégré recommandé)
- Connaissances basiques en JavaScript (variables, fonctions, objets)
- Éditeur de code comme VS Code
Initialiser le projet et installer better-sqlite3
mkdir sqlite-nodejs-tutorial
cd sqlite-nodejs-tutorial
npm init -y
npm install better-sqlite3Ces commandes créent un dossier projet, initialisent package.json et installent better-sqlite3, une wrapper synchrone autour de sqlite3. Pourquoi better-sqlite3 ? Elle évite les callbacks asynchrones complexes pour les débutants, tout en offrant des performances natives. Exécutez dans un terminal pour un setup en 30 secondes.
Créer la base de données et une table users
const Database = require('better-sqlite3');
const db = new Database('users.db');
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER CHECK (age >= 0),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
console.log('Base de données et table "users" créées avec succès.');
db.close();Ce script ouvre (ou crée) le fichier users.db, exécute une requête DDL pour créer la table users avec contraintes (PRIMARY KEY, UNIQUE, CHECK). L'analogie : comme un moule pour vos données. Toujours utiliser IF NOT EXISTS pour éviter les erreurs en re-exécution. Lancez avec node 01-setup-db.js.
Insérer des données (CREATE)
const Database = require('better-sqlite3');
const db = new Database('users.db');
const stmt = db.prepare('INSERT INTO users (name, email, age) VALUES (?, ?, ?)');
const info1 = stmt.run('Alice Dupont', 'alice@example.com', 28);
const info2 = stmt.run('Bob Martin', 'bob@example.com', 35);
console.log('Utilisateurs insérés:', info1.changes + info2.changes, 'lignes affectées');Préparez une requête paramétrée avec ? pour éviter les injections SQL (sécurité critique). run() retourne un objet avec changes (nombre de lignes). Analogie : comme un tampon réutilisable pour insérer en masse. Testez après 01-setup-db.js ; relancez sans doublons email.
Lire des données (READ)
const Database = require('better-sqlite3');
const db = new Database('users.db');
const allUsers = db.prepare('SELECT * FROM users ORDER BY created_at DESC').all();
const userById = db.prepare('SELECT * FROM users WHERE id = ?').get(1);
const usersByAge = db.prepare('SELECT name, email FROM users WHERE age > ?').all(30);
console.log('Tous les users:', JSON.stringify(allUsers, null, 2));
console.log('User ID 1:', userById);
console.log('Users >30 ans:', usersByAge);all() récupère toutes les lignes en tableau, get() une seule ligne objet. ORDER BY trie les résultats. Analogie : comme filtrer une liste Excel. Parfait pour l'affichage ; JSON.stringify pour debug. Exécutez après inserts.
Mettre à jour et supprimer (UPDATE/DELETE)
const Database = require('better-sqlite3');
const db = new Database('users.db');
const updateStmt = db.prepare('UPDATE users SET age = ? WHERE id = ?');
const deleteStmt = db.prepare('DELETE FROM users WHERE id = ?');
updateStmt.run(32, 2);
deleteStmt.run(1);
const remaining = db.prepare('SELECT * FROM users').all();
console.log('Après update/delete:', JSON.stringify(remaining, null, 2));run() pour UPDATE/DELETE retourne changes. Toujours WHERE pour cibler précisément, sinon tout est modifié ! Analogie : édition chirurgicale. Vérifiez remaining pour confirmer. Nettoie la DB pour tests répétés.
Transactions et backup
const Database = require('better-sqlite3');
const fs = require('fs');
const db = new Database('users.db');
// Transaction
db.transaction(() => {
db.prepare('INSERT INTO users (name, email, age) VALUES (?, ?, ?)').run('Charlie', 'charlie@example.com', 25);
db.prepare('INSERT INTO users (name, email, age) VALUES (?, ?, ?)').run('Diana', 'diana@example.com', 29);
// Si erreur ici, rollback auto
})();
// Backup
db.backup('users-backup.db');
console.log('Transaction et backup réussis.');
db.close();transaction() assure atomicité : tout ou rien. backup() copie la DB entière. Essentiel pour intégrité et migrations. Analogie : coffre-fort avec verrou. Utile en prod pour snapshots quotidiens.
Bonnes pratiques
- Toujours fermer la DB : Appelez db.close() pour libérer les ressources et éviter les locks fichiers.
- Utilisez des prepared statements : Prévention automatique des injections SQL, plus performant pour batches.
- Gérez les erreurs : Wrappez en try/catch, vérifiez contraintes (UNIQUE, CHECK).
- Indexez les colonnes filtrées : db.exec('CREATE INDEX idx_email ON users(email)') pour accélérer SELECT WHERE.
- Migrations : Utilisez des outils comme sqlite3-migrate pour versions DB en équipe.
Erreurs courantes à éviter
- Oublier db.close() : Cause locks sur Windows/Mac, DB inutilisable ensuite.
- Pas de prepared statements : Vulnérable aux injections ; jamais concaténer strings SQL.
- Transactions imbriquées : better-sqlite3 les gère, mais testez avec beaucoup de données.
- Chemins absolus pour DB : Utilisez __dirname + '/data.db' pour portabilité cross-platform.
Pour aller plus loin
Maîtrisez SQLite en profondeur avec nos formations Learni. Ressources :
- Docs better-sqlite3
- SQLite Tutorial officiel
- Projet avancé : Intégrez avec Express.js pour une API REST complète.