5.[Synchronisation de données distantes avec récupération des clés étrangères](#exemple-5-synchronisation-de-données-distantes-avec-récupération-des-clés-étrangères)
6.[[Bonus] Appliquer un CRON](#exemple-z-appliquer-un-cron)
*NB: Refonte en cours, plus d'information sur l'ancien moteur (peut être encore actuel) d'UnicaenDbImport en [cliquant ici](https://git.unicaen.fr/lib/unicaen/db-import/tree/2ceb3a7e#dans-le-moteur).*
*NB: Refonte en cours, plus d'information sur l'ancien moteur (peut être encore actuel) d'UnicaenDbImport
en [cliquant ici](https://git.unicaen.fr/lib/unicaen/db-import/tree/2ceb3a7e#dans-le-moteur).*
Introduction
@@ -25,6 +26,8 @@ Introduction
Ce module réalise l'import et/ou la synchronisation de données *sources* vers une table d'une base de données
*destination*.
L'import et la synchronisation sont 2 mécanismes distincts.
La source peut être :
- soit une base de données (une table ou un "select"),
- soit une API (web service).
@@ -34,7 +37,6 @@ Principe de l'*import* :
- Les données obtenues de la source sont insérées dans la table destination.
Principe de la *synchronisation* :
- Si la source contient un enregistrement qui n'existe pas dans la destination, il est ajouté dans cette dernière.
- Si la source contient un enregistrement qui existe aussi dans la destination avec les mêmes valeurs de colonnes,
rien n'est fait.
@@ -49,6 +51,8 @@ Les données source et les enregistrements destination doivent avoir un identifi
de les rapprocher : on l'appellera "code source" (cf. paramètre de config `source_code_column`).
**Cet identifiant DOIT être de type chaîne de caractères.**
Afin de faciliter l'adaptation au plus grand nombre de SGBD, UnicaenDbImport s'appuie sur l'_ORM Doctrine 2_.
*`CHOCOLATINE`(int ID, str NOM, str BOULANGERIE, int POURCENT_GRAS, int NOTE)
En outre, on suppose avoir déclaré les configurations _Doctrine_ 'orm_A' et 'orm_B' respectivement pour les bases **A** et **B** ci-dessus (soit dans le fichier [unicaen-db-import.local.php](config/unicaen-db-import.local.php.dist) soit dans un autre fichier de config.).
En outre, on suppose avoir déclaré les configurations Doctrine `orm_A` et `orm_B` respectivement pour les bases **A**
et **B** ci-dessus (dans le fichier [unicaen-db-import.local.php](config/unicaen-db-import.local.php.dist) par exemple).
**Rappel :** L'ensemble des tables _Source_ et _Destination_ doivent exister au préalable.
**Rappel :** Les tables _Source_ et _Destination_ doivent exister au préalable.
Pour les exemples qui suivent, voici à quoi ressemble le fichier de config `unicaen-db-import.local.php` :
@@ -275,13 +282,16 @@ return [
'eventmanager'=>'orm_B',
],
],
],
];
```
### Exemple 1 : Import d'une table de données distantes
### Exemple 1 : Import de données provenant d'une autre base
Dans de nombreux cas, on peut souhaiter importer une table de données provenant d'une base distante.
#### Exemple 1.1 : Import d'une table
Dans de nombreux cas, on peut souhaiter importer une table de données provenant d'une autre base que celle de destination.
Ce peut être le cas notamment lorsque l'on souhaite s'assurer de la constante disponibilité des données.
`unicaen-db-import.global.php`
@@ -314,11 +324,7 @@ return [
php public/index.php run import --name"IMPORTATION DES DONNÉES B VERS A"
```
### Exemple 2 : Import d'un select de données distantes
Les bases distantes requêtées sont généralement bien garnies.
Pourtant il est fréquent de ne vouloir importer qu'une partie de ces données.
#### Exemple 1.2 : Import d'un "select"
`unicaen-db-import.global.php`
```php
@@ -351,7 +357,7 @@ php public/index.php run import --name "IMPORTATION PARTIELLE DES DONNÉES B VER
```
### Exemple 3 : Import de données issues d'une API
### Exemple 2 : Import de données obtenues via une API
Dans certains cas, on peut souhaiter importer les données provenant d'une API (web service).
@@ -389,11 +395,10 @@ php public/index.php run import --name "WS_IMPORT_REGIONS"
```
### Exemple 4 : Synchronisation de données locales
### Exemple 3 : Synchronisation de données au sein d'une même base
Dans la pratique, vous ne rencontrerez probablement pas ce cas d'exemple seul (voir [Exemple 5](#exemple-5-synchronisation-de-données-distantes-avec-récupération-des-clés-étrangères)).
Supposez donc posséder 2 tables, l'une d'elle pouvant être qualifiée de "brut"/"en vrac" (d'où proviennent les données) et l'autre "propre" (avec une historisation attendue).
On souhaite alors synchroniser la première table avec la seconde.
Exemple d'un "select" source mettant en forme des données et d'une table destination synchronisée à partir
de ces données :
`unicaen-db-import.global.php`
```php
@@ -428,13 +433,15 @@ php public/index.php run synchro --name "SYNCHRONISATION LOCALE DE DONNÉES DE A
*NB: Fonctionne également en spécifiant une 'table' au lieu d'un 'select' dans la 'source'.*
### Exemple 5 : Synchronisation de données distantes
### Exemple 4 : Synchronisation de données distantes
#### Exemple 5.1 : Source de type base de données
#### Exemple 4.1 : Source de type base de données
Cet exemple sera probablement l'une des utilisations les plus récurrente d'UnicaenDbImport.
Par exemple, vous possédez une base distante contenant des utilisateurs et une base locale possédant ses propres utilisateurs.
Vous souhaitez alors harmoniser vos utilisateurs présent localement et ceux disponible sur la base distante.
Par exemple, vous avez accès à une base de données contenant des utilisateurs et la base de données de votre application
possédant ses propres utilisateurs.
Vous souhaitez alors synchroniser vos utilisateurs avec ceux disponibles dans l'autre base.
`unicaen-db-import.global.php`
```php
@@ -470,14 +477,14 @@ return [
php public/index.php run synchro --name"SYNCHRONISATION DISTANTE DE DONNÉES DE B VERS A"
```
*NB: Une synchronisation de données distantes fait en réalité appel à la fois au mécanisme d'import et au mécanisme de
synchronisation locale (voir [Fonctionnement](#fonctionnement)) ; d'où la présence (facultative) des paramètres
`intermediate_table` et `intermediate_table_auto_drop`.*
Une synchronisation de données à partir d'une autre base de données fait en réalité appel à la fois au mécanisme
d'import et au mécanisme de synchronisation (voir [Fonctionnement](#fonctionnement)) ; d'où la présence
des paramètres`intermediate_table` et `intermediate_table_auto_drop` (facultatifs).
*NB-2: Fonctionne également en spécifiant une 'table' au lieu d'un 'select' dans la 'source'.*
Fonctionne également en spécifiant une 'table' au lieu d'un 'select' dans la 'source'.
#### Exemple 5.2 : Source de type API
#### Exemple 4.2 : Source de type API
`unicaen-db-import.global.php`
```php
@@ -512,16 +519,22 @@ php public/index.php run synchro --name "WS_SYNCHRO_COMMUNES"
```
### Exemple 6 : Synchronisation de données distantes avec récupération des clés étrangères
### Exemple 5 : Synchronisation de données distantes avec récupération des clés étrangères
De nombreux cas d'utilisation suivront cet exemple.
Si vous observez les tables (base locale) déclarées au début de cette section [Exemples](#exemples), vous pourrez constater que les formations possèdent des clés étrangères vers les composantes (via leur ID).
Si vous observez les tables exemples évoquées au début de cette section [Exemples](#exemples), vous pourrez
constater que les formations possèdent des clés étrangères vers les composantes.
Pour gérer le cas de ces clés étrangères, il vous faudra :
- Déclarer un mécanisme d'import
- Déclarer un mécanisme de synchro
- Créer une vue (conventionnellement nommée SRC_*XXX*) réalisant les jointures nécessaires à la récupération des clés étrangères
- Configurer un mécanisme d'import de la base source vers une table temporaire ;
- Créer une vue source (conventionnellement préfixée par `SRC_`) puisant dans la table temporaire et réalisant les jointures
nécessaires à l'alimentation des clés étrangères ;
- Configurer un mécanisme de synchro de la vue source vers la table destination finale.
Voici l'exemple d'une vue `SRC_FORMATION` puisant dans la table temporaire `TMP_FORMATION` et mettant en forme les
données qui seront la source de la synchronisation vers la table finale `FORMATION` :
`Console de la base de données locale`
```sql
CREATEVIEWSRC_FORMATIONAS
SELECT
@@ -540,7 +553,7 @@ return [
'import'=>[
'imports'=>[
[
'name'=>"IMPORTATION DE DONNÉES B VERS A",
'name'=>"IMPORTATION PRÉALABLE",// Importation des données externes dans une table temporaire
'source'=>[
'name'=>'TABLE FORMATION DE MA BASE B',
'select'=>'SELECT ID, CODE, NOM, COMPOSANTE_CODE FROM FORMATION',
@@ -557,10 +570,10 @@ return [
],
'synchros'=>[
[
'name'=>"SYNCHRONISATION DE DONNÉES DÉJÀ IMPORTÉE DE B VERS A",//Autrement dit une synchro locale
'name'=>"SYNCHRONISATION FINALE",// Synchro des données mise en forme vers la table finale
'source'=>[
'name'=>'TABLE SRC_FORMATION DE MA BASE A UTILISANT TMP_FORMATION',
'select'=>'SELECT * FROM SRC_UTILISATEUR',
'select'=>'SELECT * FROM SRC_FORMATION',
'connection'=>'orm_A',
'source_code_column'=>'ID',
],
@@ -569,7 +582,6 @@ return [
'table'=>'FORMATION',
'connection'=>'orm_A',
'source_code_column'=>'ID',
],
],
],
@@ -579,20 +591,24 @@ return [
`Terminal du serveur`
```bash
php public/index.php run import --name"IMPORTATION DE DONNÉES B VERS A"
php public/index.php run synchro --name"SYNCHRONISATION DE DONNÉES DÉJÀ IMPORTÉE DE B VERS A"
php public/index.php run import --name"IMPORTATION PRÉALABLE"
php public/index.php run synchro --name"SYNCHRONISATION FINALE"
```
*NB: Dans cet exemple, la table TMP_XXX doit être préalablement créée. Elle ne sera donc pas supprimée à la fin de la synchronisation. De nouvelles fonctionnalités à venir devraient pouvoir automatiser cette suppression.*
Dans cet exemple, la table `TMP_FORMATION` doit être préalablement créée. Elle ne sera donc pas supprimée à la fin de la
synchronisation. De nouvelles fonctionnalités à venir devraient pouvoir automatiser cette suppression.
Développement
-------------
Ajouter le support d'une autre plateforme de base de données (pour développeur)