PHPackages                             starker-xp/database-checker - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. starker-xp/database-checker

ActiveLibrary[Database &amp; ORM](/categories/database)

starker-xp/database-checker
===========================

Get diff between actual schema and json configuration

0.0.9(7y ago)0421MITPHPPHP ^7.1.3CI passing

Since Feb 28Pushed 3mo ago2 watchersCompare

[ Source](https://github.com/starker-xp/database-checker)[ Packagist](https://packagist.org/packages/starker-xp/database-checker)[ RSS](/packages/starker-xp-database-checker/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (9)Dependencies (5)Versions (10)Used By (0)

database-checker
================

[](#database-checker)

> **Archive** — Outil PHP de comparaison et synchronisation de schémas MySQL. Compare la structure d'une base de données (ou un export JSON) avec une structure de référence et génère les instructions SQL (`ALTER`, `CREATE`, `DROP`) nécessaires pour les synchroniser. **Utilisé en production** dans le cadre d'une migration d'un projet legacy PHP 4.x vers PHP 5.X.

[![Coverage Status](https://camo.githubusercontent.com/e12a2cbf858769fc257981e8f0a0874d023af67f2158086f4fa5f0dc17f6f41c/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f737461726b65722d78702f64617461626173652d636865636b65722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/starker-xp/database-checker?branch=master) [![Build Status](https://camo.githubusercontent.com/58cfb470d0cf04846fa6716ca250f4e929f283175219b48a3414187e51ba2c1d/68747470733a2f2f7472617669732d63692e6f72672f737461726b65722d78702f64617461626173652d636865636b65722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/starker-xp/database-checker) [![Scrutinizer Code Quality](https://camo.githubusercontent.com/3bfac72f8719600a4d2f5f6f853a0f095a29b98c643ea2fda7b270e5a7afa7f1/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f737461726b65722d78702f64617461626173652d636865636b65722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/starker-xp/database-checker/?branch=master)

Contexte
--------

[](#contexte)

Sur un projet de migration d'une application legacy PHP 4.x vers PHP 5.X, je me suis retrouvé confronté à un problème de synchronisation de **plus de 200 bases de données clients**. Les migrations de schéma étaient jusqu'alors jouées manuellement, ce qui entraînait régulièrement des erreurs : colonnes manquantes, index absents, collations incohérentes d'une instance à l'autre. Il n'existait aucun outil pour vérifier automatiquement si une instance client était conforme au schéma de référence. J'ai développé cet outil pour fiabiliser ce processus dans un délai contraint d'un mois.

> *Analyse rétrospective réalisée en 2026 dans le cadre d'un nettoyage et d'une mise en archive de mes dépôts GitHub/GitLab.*

Fonctionnalités
---------------

[](#fonctionnalités)

```
┌─────────────────────────────────────────────────────────────────┐
│                      database-checker                           │
├─────────────────────────────────────────────────────────────────┤
│  Source de données    Base MySQL live ou fichier JSON            │
│  Diff de schéma       Tables, colonnes, index, clés primaires   │
│  Génération SQL       CREATE TABLE, ALTER TABLE, DROP COLUMN    │
│  Collations           Vérification DB / table / colonne         │
│  Moteurs              Vérification InnoDB, MyISAM, MEMORY...    │
│  Optimisation         ENUM('0','1') → TINYINT(1)               │
│  Sécurité             DROP désactivé par défaut                 │
│  Export               Structure → JSON versionnable             │
└─────────────────────────────────────────────────────────────────┘

```

### Workflow type

[](#workflow-type)

```
  Base MySQL client          Schéma de référence (JSON)
        │                              │
        ▼                              ▼
  MysqlDatabaseFactory          JsonDatabaseFactory
        │                              │
        ▼                              ▼
   MysqlDatabase ◄──── diff ────► MysqlDatabase
                         │
                         ▼
              Statements SQL (ALTER, CREATE, DROP)

```

Architecture
------------

[](#architecture)

```
src/
├── Checker/
│   └── MysqlDatabaseCheckerService.php   # Moteur de diff entre deux MysqlDatabase
├── Exception/                             # 10 exceptions métier spécifiques
├── Factory/
│   ├── JsonDatabaseFactory.php            # Construit MysqlDatabase depuis un JSON
│   └── MysqlDatabaseFactory.php           # Construit MysqlDatabase depuis MySQL live
├── Repository/
│   ├── MysqlRepository.php                # Requêtes INFORMATION_SCHEMA
│   └── StructureInterface.php             # Abstraction pour le mock en tests
├── Structure/
│   ├── DatabaseInterface.php              # Contrat commun (create/alter/delete)
│   ├── MysqlDatabase.php                  # Modèle : base de données
│   ├── MysqlDatabaseTable.php             # Modèle : table (colonnes + index)
│   ├── MysqlDatabaseColumn.php            # Modèle : colonne (type, nullable, default...)
│   └── MysqlDatabaseIndex.php             # Modèle : index (unique, primary, standard)
└── LoggerTrait.php                        # PSR-3 logger intégré

tests/
├── Checker/MysqlDatabaseCheckerServiceTest.php
├── Factory/JsonDatabaseFactoryTest.php
├── Factory/MysqlDatabaseFactoryTest.php
├── Structure/MysqlDatabaseColumnTest.php
├── Structure/MysqlDatabaseIndexTest.php
├── Structure/MysqlDatabaseTableTest.php
├── Structure/MysqlDatabaseTest.php
└── LoggetTraitTest.php

```

Points techniques notables
--------------------------

[](#points-techniques-notables)

- **Modèle objet complet** : `MysqlDatabase` → `MysqlDatabaseTable` → `MysqlDatabaseColumn` / `MysqlDatabaseIndex` — chaque niveau sait générer ses propres statements SQL (`createStatement`, `alterStatement`, `deleteStatement`)
- **Double source** : la structure peut être construite depuis une base MySQL live (`INFORMATION_SCHEMA`) ou depuis un fichier JSON versionné en Git
- **Validation JSON** : utilisation de `Symfony\Component\OptionsResolver` pour valider la structure du JSON d'entrée avec des valeurs par défaut
- **Gestion des index lors d'un ALTER** : les index sont supprimés avant la modification d'une colonne puis recréés — c'est une contrainte MySQL souvent oubliée
- **DROP sécurisé** : les instructions `DROP COLUMN` ne sont générées que si `enableDropStatement()` est explicitement appelé — sécurité par défaut
- **Comparaison case-insensitive** : les noms de tables, colonnes et index sont comparés en minuscules pour gérer les incohérences de casse
- **PSR-3 Logger** : toutes les classes utilisent un `LoggerTrait` compatible PSR-3, permettant d'injecter n'importe quel logger (Monolog, etc.)
- **Export JSON** : `MysqlDatabaseFactory::exportStructure()` permet d'exporter le schéma actuel en JSON pour le versionner

Compétences démontrées
----------------------

[](#compétences-démontrées)

- **Résolution de problème concret** : outil développé pour un besoin réel de synchronisation multi-instances en production
- **Architecture objet** : modèle riche avec interfaces, exceptions métier, factories, repository pattern
- **Tests unitaires** : 8 fichiers de tests vérifiant les statements SQL générés (tests de comportement)
- **CI/CD** : Travis CI + Coveralls (couverture) + Scrutinizer (qualité)
- **Interopérabilité** : PSR-3 (logger), PSR-4 (autoload), Symfony OptionsResolver
- **Connaissance MySQL** : INFORMATION\_SCHEMA, collations, moteurs de stockage, gestion des index

Limitations connues
-------------------

[](#limitations-connues)

Ce projet étant un outil développé dans un délai contraint (1 mois), certaines limitations ont été identifiées avec le recul :

LimitationDétail**Pas de FOREIGN KEY**Les clés étrangères ne sont pas gérées dans le diff**FULLTEXT partiel**Les index FULLTEXT sont détectés mais pas typés correctement dans le modèle**Pas de RENAME COLUMN**Une colonne renommée est vue comme un DROP + CREATE**Pas de filtrage**Impossible d'ignorer certaines tables, colonnes ou indexAlternatives modernes
---------------------

[](#alternatives-modernes)

Ce projet a été développé à une époque où les outils disponibles ne couvraient pas ce besoin spécifique (diff multi-instances sans Doctrine). Aujourd'hui, plusieurs alternatives existent :

- **[Doctrine Migrations](https://www.doctrine-project.org/projects/migrations.html)** — gestion de migrations versionnées (nécessite Doctrine ORM)
- **[Phinx](https://phinx.org/)** — migrations de base de données indépendantes du framework
- **[Laravel Migrations](https://laravel.com/docs/migrations)** — intégré à Laravel
- **[Liquibase](https://www.liquibase.org/)** / **[Flyway](https://flywaydb.org/)** — outils multi-langages de gestion de schéma
- **[mysqldbcompare](https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbcompare.html)** — utilitaire MySQL natif de comparaison de schémas

L'intérêt de database-checker restait sa capacité à comparer un schéma de référence (JSON) avec 200+ instances live sans dépendance ORM.

Installation
------------

[](#installation)

```
composer require starker-xp/database-checker
```

Utilisation
-----------

[](#utilisation)

```
// Depuis une base MySQL live
$pdo = new PDO('mysql:host=localhost', 'user', 'pass');
$repository = new MysqlRepository($pdo);
$factory = new MysqlDatabaseFactory($repository, 'ma_base');
$currentDatabase = $factory->generate();

// Depuis un fichier JSON de référence
$json = file_get_contents('schema-reference.json');
$jsonFactory = new JsonDatabaseFactory($json);
$referenceDatabase = $jsonFactory->generate('ma_base');

// Générer le diff
$checker = new MysqlDatabaseCheckerService();
$checker->enableCheckCollate();   // optionnel
$checker->enableCheckEngine();    // optionnel
$checker->enableDropStatement();  // optionnel — désactivé par défaut
$statements = $checker->diff($currentDatabase, $referenceDatabase);

// $statements contient les ALTER/CREATE/DROP SQL à exécuter
```

Prérequis
---------

[](#prérequis)

- PHP &gt;= 7.1.3
- Symfony OptionsResolver ^4.0
- PSR Log ^1.0
- Accès à `INFORMATION_SCHEMA` pour l'introspection MySQL live

Licence
-------

[](#licence)

MIT

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance55

Moderate activity, may be stable

Popularity9

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~30 days

Recently: every ~58 days

Total

9

Last Release

2753d ago

PHP version history (4 changes)v0.0.1PHP ^5.4

0.0.4PHP &gt;=5.6

0.0.7PHP ^7.2

0.0.8PHP ^7.1.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/b003a9e7699087cfedb3cd73ffee89fc6107e2446f48a909a2ef12472bc99e36?d=identicon)[starker-xp](/maintainers/starker-xp)

---

Top Contributors

[![starker-xp](https://avatars.githubusercontent.com/u/514436?v=4)](https://github.com/starker-xp "starker-xp (71 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/starker-xp-database-checker/health.svg)

```
[![Health](https://phpackages.com/badges/starker-xp-database-checker/health.svg)](https://phpackages.com/packages/starker-xp-database-checker)
```

###  Alternatives

[guikingone/scheduler-bundle

A Symfony bundle that allows to schedule and create repetitive tasks

114217.4k](/packages/guikingone-scheduler-bundle)[damienharper/auditor

The missing audit log library.

1922.8M8](/packages/damienharper-auditor)[tommyknocker/pdo-database-class

Framework-agnostic PHP database library with unified API for MySQL, MariaDB, PostgreSQL, SQLite, MSSQL, and Oracle. Query Builder, caching, sharding, window functions, CTEs, JSON, migrations, ActiveRecord, CLI tools, AI-powered analysis. Zero external dependencies.

845.7k](/packages/tommyknocker-pdo-database-class)[code-rhapsodie/dataflow-bundle

Data processing framework inspired by PortPHP

1852.8k3](/packages/code-rhapsodie-dataflow-bundle)[bartlett/php-compatinfo-db

Reference Database of all functions, constants, classes, interfaces on PHP standard distribution and about 110 extensions

1183.0k1](/packages/bartlett-php-compatinfo-db)[perplorm/perpl

Perpl is an improved and still maintained fork of Propel2, an open-source Object-Relational Mapping (ORM) for PHP.

203.7k](/packages/perplorm-perpl)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
