Colas Mérand
19/06/2025
migration de données
JSON
SQL
5 minutes
Dans le monde du développement d'applications, l'évolution des besoins en matière de stockage de données est une constante. De nombreux projets démarrent avec des solutions simples comme les fichiers JSON pour stocker des informations, mais atteignent rapidement leurs limites lorsque l'application se développe. Aujourd'hui, nous explorons pourquoi et comment migrer d'un système de stockage basé sur des fichiers JSON vers une base de données relationnelle, une transition que nous avons accompagnée pour de nombreux clients.
Les fichiers JSON offrent une solution de stockage simple et accessible pour les projets en phase initiale. Cependant, cette approche présente plusieurs limitations :
La migration d'un système basé sur JSON vers une base de données relationnelle nécessite une approche méthodique. Voici les étapes essentielles que nous suivons chez Platane :
Avant toute migration, il est crucial d'analyser la structure des données JSON existantes. Cette étape permet d'identifier les entités, leurs relations et les contraintes à mettre en place dans le schéma de base de données.
# Exemple d'analyse d'un fichier JSON d'utilisateurs
import json
with open('users.json', 'r') as file:
users_data = json.load(file)
# Analyse de la structure
sample_user = users_data[0] if users_data else {}
print("Structure d'un utilisateur:", json.dumps(sample_user, indent=2))
Une fois la structure analysée, nous concevons un schéma de base de données adapté. Cette étape transforme les objets JSON en tables relationnelles avec des clés primaires, des clés étrangères et des contraintes appropriées.
-- Exemple de schéma SQL pour une table d'utilisateurs
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
credits INTEGER DEFAULT 0
);
-- Table pour les logs associés aux utilisateurs
CREATE TABLE user_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
action VARCHAR(100) NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
L'étape suivante consiste à remplacer les fonctions qui manipulaient les fichiers JSON par des fonctions qui interagissent avec la base de données.
# Avant : Fonction récupérant un utilisateur depuis un fichier JSON
def get_user_json(user_id):
with open('users.json', 'r') as file:
users = json.load(file)
return next((user for user in users if user['id'] == user_id), None)
# Après : Fonction récupérant un utilisateur depuis une base de données SQLite
import sqlite3
def get_user_db(user_id):
conn = sqlite3.connect('application.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
user = cursor.fetchone()
conn.close()
return user
Une fois le schéma et les fonctions d'accès en place, nous procédons à la migration des données existantes. Cette étape est critique et nécessite souvent des scripts de migration spécifiques.
# Exemple de script de migration de JSON vers SQLite
import json
import sqlite3
# Connexion à la base de données
conn = sqlite3.connect('application.db')
cursor = conn.cursor()
# Chargement des données JSON
with open('users.json', 'r') as file:
users = json.load(file)
# Migration des utilisateurs
for user in users:
cursor.execute(
"INSERT INTO users (id, username, email, credits) VALUES (?, ?, ?, ?)",
(user.get('id'), user.get('username'), user.get('email'), user.get('credits', 0))
)
# Validation et fermeture
conn.commit()
conn.close()
La phase de test est essentielle pour s'assurer que l'application fonctionne correctement avec la nouvelle architecture de données. Nous mettons en place des tests unitaires et d'intégration pour valider chaque fonctionnalité.
# Exemple de test unitaire pour la fonction d'accès à la base de données
import unittest
class DatabaseMigrationTests(unittest.TestCase):
def setUp(self):
# Initialisation de la base de données de test
self.conn = sqlite3.connect(':memory:')
self.cursor = self.conn.cursor()
# Création des tables...
def test_get_user(self):
# Insertion d'un utilisateur de test
self.cursor.execute("INSERT INTO users VALUES (1, 'testuser', 'test@example.com', '2023-01-01', 100)")
self.conn.commit()
# Test de la fonction
user = get_user_db(1)
self.assertIsNotNone(user)
self.assertEqual(user[1], 'testuser')
Le choix de la base de données dépend des besoins spécifiques du projet :
Chez Platane, nous privilégions PostgreSQL pour la plupart de nos projets web, notamment ceux déployés sur Vercel. Notre expérience avec des projets comme Astory (plateforme de location d'œuvres d'art) et Epictory (génération de posters basés sur des parcours Strava) nous a démontré la robustesse et la flexibilité de PostgreSQL dans des environnements cloud modernes.
L'un des avantages majeurs de la migration vers une base de données est la facilité d'intégration avec des plateformes d'hébergement modernes comme Vercel. Voici quelques bonnes pratiques que nous appliquons :
// Exemple de configuration dans Next.js avec Vercel
import { Pool } from 'pg';
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});
export default async function handler(req, res) {
const client = await pool.connect();
try {
const result = await client.query('SELECT * FROM users');
res.status(200).json(result.rows);
} finally {
client.release();
}
}
Pour les projets déployés sur Vercel, nous recommandons l'utilisation de services de base de données managés comme :
Ces services offrent une intégration simplifiée, des sauvegardes automatiques et une scalabilité adaptée aux besoins du projet.
Au fil des années, nous avons accompagné plusieurs clients dans cette transition. Par exemple, pour Easop, une plateforme de gestion de stock options, nous avons migré d'un système initial basé sur des fichiers JSON vers une architecture PostgreSQL complète. Cette migration a permis de supporter la croissance rapide de l'application, qui a finalement été rachetée pour plusieurs millions d'euros.
De même, pour notre propre plateforme de gestion de contenu automatisée par l'IA, nous avons opté dès le départ pour PostgreSQL, ce qui nous a permis de gérer efficacement les relations complexes entre les différents types de contenus et d'assurer des performances optimales même avec un volume croissant de données.
La migration d'un système de stockage basé sur JSON vers une base de données relationnelle représente une étape cruciale dans l'évolution d'une application. Bien que cette transition demande un investissement initial en temps et en ressources, les bénéfices en termes de performances, de fiabilité et de scalabilité sont considérables sur le long terme.
Chez Platane, nous accompagnons régulièrement nos clients dans cette transformation, en apportant notre expertise technique et notre expérience acquise sur des projets variés. Notre approche méthodique garantit une migration en douceur, sans perte de données ni interruption de service.
Vous envisagez de faire évoluer votre application vers une architecture de données plus robuste ? N'hésitez pas à nous contacter via notre formulaire de contact pour échanger sur votre projet. Notre équipe d'experts sera ravie d'analyser vos besoins spécifiques et de vous proposer une solution sur mesure, alliant technologies de pointe et créativité pour atteindre vos objectifs.
Vous préférez discuter de vive voix ? Nous aussi et c'est évidemment sans engagement !
Une question, un besoin de renseignements ? N'hésitez pas à nous contacter.