lumnik. / scénarios Tous les scénarios · English

Une fiche produit réunit PostgreSQL et Oracle sans rien migrer

Objectif Montrer une fiche produit complète quand le produit vit dans PostgreSQL et sa catégorie dans Oracle, sans toucher aux deux bases.

Les produits vivent dans PostgreSQL, leurs catégories dans Oracle. Deux connecteurs jdbc les lisent sans rien y écrire, et une entité les joint.

$ lm secret set MERGE_DB_POSTGRES_PASSWORD -
Updated secret "MERGE_DB_POSTGRES_PASSWORD"

$ lm secret set MERGE_DB_ORACLE_PASSWORD -
Updated secret "MERGE_DB_ORACLE_PASSWORD"
postgres-m_product.sql.txt
-- PostgreSQL, database erp, as erp_reader
SELECT m_product_id, m_product_category_id, name, isactive FROM m_product
WHERE m_product_id IN (1024944, 1025082, 9999999) ORDER BY m_product_id;

 m_product_id | m_product_category_id |     name     | isactive 
--------------+-----------------------+--------------+----------
      1024944 | 1000021               | 4120.300.042 | N
      1025082 | 1000021               | 160-8487     | Y
      9999999 | 9999999               | NO-CATEGORY  | Y
(3 rows)

SELECT count(*) FROM m_product;
 count 
-------
 40234
(1 row)
oracle-m_product_category.sql.txt
-- Oracle Free 23ai, service FREEPDB1, schema ERP
SELECT M_PRODUCT_CATEGORY_ID, NAME, ISACTIVE FROM M_PRODUCT_CATEGORY
WHERE M_PRODUCT_CATEGORY_ID IN ('1000017', '1000018', '1000021', '9999999') ORDER BY M_PRODUCT_CATEGORY_ID;


M_PRODUCT_CATEGORY_ID  NAME                           ISACTIVE
---------------------- ------------------------------ --------
1000017                Filtration à sable             Y
1000018                Filtration à cartouche         Y
1000021                Pompes                         Y


  COUNT(*)
----------
        63
manifests/30-product-with-category.yaml
kind: Entityname: MergedProductBdescription: Products from PostgreSQL enriched with their Oracle category.match: [product_id]scopes: [catalogue]sources:  - table: t_m_product_b    map:      m_product_id: product_id      m_product_category_id: category_id      name: product_name      description: product_description      isactive: product_activejoins:  - table: t_m_product_category_b    from: category_id    to: m_product_category_id    map:      name: category_name      description: category_description      isactive: category_active
$ lm entity get MergedProductB --filter product_id=1024944 -o json
[
  {
    "product_id": "1024944",
    "category_id": "1000021",
    "product_name": "4120.300.042",
    "product_description": "Moteur de pompe 0,75 cv Mono",
    "product_active": "N",
    "category_name": "Pompes",
    "category_description": "Pompes centrifuges ou auto-amorçantes",
    "category_active": "Y",
    "_conflicts": "{}"
  }
]

$ lm entity get MergedProductB --filter product_id=1025082 -o json
[
  {
    "product_id": "1025082",
    "category_id": "1000021",
    "product_name": "160-8487",
    "product_description": "POMPE FILTRATION PLUS 860 300 W MONOPHASE (DAB)",
    "product_active": "Y",
    "category_name": "Pompes",
    "category_description": "Pompes centrifuges ou auto-amorçantes",
    "category_active": "Y",
    "_conflicts": "{}"
  }
]

$ lm entity get MergedProductB --filter product_id=9999999 -o json
[
  {
    "product_id": "9999999",
    "category_id": "9999999",
    "product_name": "NO-CATEGORY",
    "product_description": "Synthetic product without a category, proving LEFT JOIN preservation",
    "product_active": "Y",
    "category_name": null,
    "category_description": null,
    "category_active": null,
    "_conflicts": "{}"
  }
]

Limites

  • Le produit 9999999 est un témoin synthétique ajouté pour prouver la jointure gauche.
  • mode: full ne voit pas une ligne modifiée sur place: pour suivre les mises à jour, il faut une colonne de watermark.
  • Données synthétiques.

Catalogue · deux bases

Le produit est dans PostgreSQL.

Sa catégorie est dans Oracle.

Deux bases héritées, aucune ne voit l'autre.

Catalogue synthétique

Le problème

Une fiche produit demande les deux.

  • Migrer une base coûte un projet.
  • Un ETL maison est un script de plus.
  • Une jointure ratée fait disparaître des produits.

Rien n'est migré

Les deux bases restent où elles sont.

  • Deux comptes en lecture seule.
  • Les mots de passe dans lm secret.
  • Aucune application à développer.

Ce qu'il a fallu écrire

joins:
  - table: t_m_product_category_b

Une jointure entre les deux bases.

Le scénario complet tient en 3 fichiers de déclaration, 68 lignes.

Ce que montre la fiche

4120.300.042, catégorie Pompes.

  • Le produit vient de PostgreSQL.
  • Pompes vient d'Oracle.
  • 40 234 produits, chacun une seule fois.

Rejeu du 3 novembre 2026.

Rien ne disparaît

Un produit sans catégorie reste.

  • 9999999 n'a pas de catégorie dans Oracle.
  • Il est sur la fiche, catégorie vide.
  • La jointure est une jointure gauche.

La limite

Le mode full ne voit pas une ligne modifiée sur place.

  • Il relit ce qui suit la dernière clé.
  • Pour suivre les mises à jour: une colonne de watermark.
  • Oracle est réservé à l'édition Pro.

Essayer

Le scénario se rejoue de bout en bout.

PostgreSQL, Oracle, entité: chaque étape est publiée avec sa sortie.

Ce scénario demande lumnik Pro.

Voir l'offre →