Bases de données (.lnc)

Voir la vidéoAnalyser des données 00:23

La connexion

Une connexion est un fichier .lnc (LightNote Connection) dans l'espace de travail lui-même — versionnable dans Git et portable d'une machine à l'autre. Les connexions du dossier apparaissent dans le panneau Connexions de la barre latérale (l'icône de base de données), chacune avec un point d'état (vert connectée, gris déconnectée, rouge en erreur) et, en dessous, les scripts qui lui appartiennent. Créez-en une par Nouveau → Nouvelle connexion BD ou avec le bouton du panneau ; ouvrir un .lnc depuis l'arborescence de fichiers mène aussi au panneau. Sous la liste se trouve l'arborescence des objets de la connexion sélectionnée. Le menu contextuel de la connexion propose Se connecter/Se déconnecter, Nouveau script, Console SQL et Modifier la connexion.

Dossier sans connexion : le panneau Connexions vide propose Nouvelle connexion… et Ouvrir un fichier de base…, et liste les bases SQLite et DuckDB en fichier déjà présentes dans le dossier, chacune avec un Se connecter. La base est reconnue au contenu du fichier, pas à l'extension (un .db peut être l'une ou l'autre) ; un clic crée la connexion (.lnc) à côté du fichier, qu'elle désigne par son nom — les deux voyagent ensemble — et se connecte aussitôt.

Scripts : un script est un fichier .sql ordinaire et s'ouvre dans l'onglet de code, comme tout fichier — avec historique, barre des modifications et Enregistrer la version. Au début de la barre de l'onglet se trouvent le sélecteur de connexion et le bouton Exécuter ; les résultats apparaissent sous l'éditeur à la première exécution (ou à côté : Exécuter → Résultats à côté). La connexion d'origine du script est enregistrée dans le .lnc, et à la réouverture le script pointe déjà vers elle. Choisir une autre connexion dans le sélecteur ne vaut que pour cet onglet ; pour changer l'origine, utilisez Toujours utiliser « … » pour ce script. Un script sans origine s'ouvre en Sans connexion, même si le dossier n'a qu'une connexion : aucun script ne s'ouvre pointé vers une base que vous n'avez pas choisie. La Console SQL est un onglet sans fichier, déjà lié à la connexion. L'Espace d'analyse d'un résultat est enregistré à côté du script (requete.sql.analysis.json), un par requête : le fichier garde les graphiques, les tableaux croisés et le SQL de chacun — jamais les données.

Une session par onglet : chaque onglet de script ouvre sa propre session avec la base — une requête longue dans un onglet ne bloque ni les autres ni l'arborescence des objets, et le Commit d'un onglet ne valide pas ce qu'un autre a fait. Les tables temporaires et les commandes SET ne valent que dans l'onglet où elles ont été exécutées. Si le serveur limite le nombre de connexions, décochez Une session par onglet dans Modifier la connexion. Les fichiers SQLite et DuckDB partagent toujours la même session (en SQLite, une écriture verrouille tout le fichier). Le panneau indique combien de sessions chaque connexion a ouvertes.

Pilotes : SQLite et DuckDB (fichier) natifs ; PostgreSQL, MySQL/MariaDB, SQL Server et générique via ODBC ; Oracle natif (sans ODBC). SQL Server utilise le pilote msodbcsql de Microsoft (installez-le sur la machine) et propose l'Authentification Windows ou utilisateur/mot de passe, ainsi que les options de chiffrement du canal (Encrypt / faire confiance au certificat). Pour Oracle, indiquez le dossier de l'Oracle Instant Client dans Paramètres → Base de données — il est chargé à l'exécution, sans rien à installer. La connexion Oracle a quatre modes : Service Name (hôte/port/service), SID (hôte/port/SID), Nom TNS (alias du tnsnames.ora dans le dossier du client) et Descripteur TNS complet (collé dans un champ de texte).

Mot de passe : cochez Enregistrer le mot de passe pour le chiffrer dans le .lnc lui-même (crypto portable, s'ouvre sur une autre machine) ; décoché, le mot de passe n'est pas enregistré et est demandé à chaque connexion. Le chiffrement utilise une Phrase-Sécurité par espace de travail, définie dans Aide → Configurer la Phrase-Sécurité ; gardez-la en sécurité — sans elle, le mot de passe ne peut être ouvert nulle part ailleurs. La Phrase-Sécurité n'est mise en cache que sur la machine locale (elle ne va jamais dans Git).

Cochez Se connecter à l'ouverture pour que la connexion s'ouvre d'elle-même quand vous ouvrez l'un de ses scripts. La connexion automatique est silencieuse : si le mot de passe doit être saisi (mode demander, ou chiffré sans la Phrase-Sécurité en cache sur la machine), le script s'ouvre déconnecté, sans vous interrompre.

La production sans crainte : dans Modifier la connexion, le champ Environnement indique de quelle base il s'agit — Développement, Recette ou Production —, et sa couleur apparaît sur le sélecteur de connexion de l'onglet .sql, sur une bande en haut de l'onglet et sur un badge dans le panneau Connexions. Sur une connexion de production, ce qui modifie la base (INSERT, UPDATE, DELETE, CREATE, DROP, procédures…) montre d'abord ce qui va s'exécuter et demande confirmation, avec l'UPDATE/DELETE sans WHERE mis en évidence ; le bouton par défaut est Annuler, et l'enregistrement des modifications de la grille demande de la même façon. Cochez Lecture seule pour que la connexion refuse tout ce qui modifie la base — dans le script, dans la grille et dans les données d'une table — avant que l'instruction ne quitte LightNote : la grille ne propose plus l'édition et, sous SQLite, le fichier s'ouvre en lecture seule. Ce dont LightNote ne peut pas dire s'il ne fait que lire (un bloc BEGIN … END, un DECLARE) compte comme une écriture.

Tunnel SSH : pour une base derrière un serveur SSH (bastion), choisissez dans Tunnel SSH une connexion SSH (.lns) de l'espace de travail — la même que celle du terminal distant, avec utilisateur, clé ou mot de passe chiffré. Hôte et Port deviennent alors ceux de la base vus depuis le serveur SSH (souvent localhost). À la connexion, LightNote ouvre le tunnel et atteint la base par lui ; se déconnecter ferme le tunnel. Il ne démarre que quand vous vous connectez (jamais à l'ouverture du fichier), le .lns doit être dans l'espace de travail, et les options de ssh qui exécutent des commandes (ProxyCommand, LocalCommand, -F) sont refusées — -J est accepté. Seules les options d’une liste autorisée passent (-J, -i, -4/-6, -C et -o avec des clés de connexion, de chiffrement et d’authentification) : -A, -R, -I et -E sont aussi refusées. Une connexion avec tunnel n'est ouverte ni par l'IA (MCP), ni par lnote, ni par les Blocs, qui se connecteraient directement.

Informations du serveur : à la connexion, l’application demande à la base ce qu’elle indique sur elle-même — la version, la base et le schéma courants, l’utilisateur, la taille, l’encodage, le classement et le fuseau horaire, et si le serveur accepte l’écriture (une réplica ne l’accepte pas). La version apparaît dans l’infobulle de la connexion, et le reste dans Informations du serveur…, dans le menu contextuel de la connexion, avec un bouton pour le copier. Une donnée que le serveur ne fournit pas — version ancienne, privilège manquant — est omise, sans erreur. La version est envoyée quand vous demandez à l’IA d’expliquer une erreur ou d’analyser un plan : la syntaxe qu’elle peut proposer en dépend.

Clés étrangères avec SQLite : SQLite n’applique les clés étrangères déclarées — et le ON DELETE CASCADE — que si la connexion le demande, et les connexions de l’application le demandent : supprimer une ligne que d’autres référencent, ou insérer une référence à un enregistrement inexistant, est refusé, et le CASCADE supprime les enfants comme le schéma l’indique. La case Vérifier les clés étrangères, dans Modifier la connexion…, désactive cela — seulement pour un chargement en masse dans le désordre. L’activer ne vérifie pas ce qui est déjà dans le fichier : Informations du serveur… compte, par table, les références cassées qui existent déjà (lignes qui pointent vers un enregistrement inexistant), écrites par un outil qui ne les vérifiait pas.

Exécuter et lire le résultat

Exécuter : Ctrl+Entrée exécute l'instruction sous le curseur et Alt+X exécute tout le script ; les résultats apparaissent paginés, chacun dans un onglet Résultat avec une barre d'actions en bas : Charger le bloc suivant, Figer le résultat, Total, changer la Limite de lignes, Actualiser (réexécute), Voir/Copier le SQL, Exporter... et Générer du SQL à partir de la ligne sélectionnée. Ce qu’est une instruction vient du texte lui-même : un bloc BEGIN … END et un corps $$ … $$ restent entiers, et une ligne ne contenant que / (Oracle) ou GO (SQL Server) sépare aussi.

Écrire du SQL avec de l'aide : Ctrl+Espace complète selon le contexte : après FROM, JOIN, UPDATE ou INTO viennent les tables de la base (la liste s'ouvre seule quand vous tapez l'espace), et après alias. viennent les colonnes de cette table (elle s'ouvre seule quand vous tapez le point) — même avant que le FROM soit écrit, et sans rien déplier dans l'arbre : LightNote lit le catalogue de la base en arrière-plan, et les colonnes seulement quand le texte y arrive. Dans un script à plusieurs instructions, celle que Ctrl+Entrée va exécuter est mise en évidence. Quand une instruction échoue, elle est marquée dans l'éditeur, le nom que la base a désigné (la table ou la colonne qui n'existe pas, l'endroit de l'erreur de syntaxe) est souligné d'une vague, le curseur y va et le message apparaît quand la souris s'arrête dessus. Ctrl+clic ou F12 sur un nom de table ouvre ses données ; F4, ses propriétés. Formater (Shift+Alt+F) met le SQL en forme sans outil installé : une clause par ligne, les éléments du SELECT un par ligne quand il y en a plusieurs, AND/OR et sous-requêtes indentés. Il ne change que les espaces et la casse des mots-clés, jamais un nom, un texte ou un commentaire, et laisse tels quels les instructions qui ne sont pas des requêtes (CREATE, blocs BEGIN … END).

Figer le résultat : lit le résultat entier de la base en une seule passe et le conserve dans une table locale (sur disque, s'il ne tient pas en mémoire). Ensuite la grille défile sans interroger la base, le nombre de lignes devient exact (sans passer par Compter le total), cliquer sur un en-tête trie (un nouveau clic inverse ; un troisième revient à l'ordre livré par la base), et l'export lit lui aussi la copie locale. Le tri par l'en-tête vaut jusqu'à 100 000 lignes ; au-delà il est refusé, avec le motif dans l'infobulle de l'en-tête, car chaque page devrait retrier la copie entière et parcourir la grille reprendrait des minutes. Un résultat déjà arrivé entier dans la première page se trie sans figer : les lignes sont déjà en mémoire. Ce qui ne se trie pas, c'est la première partie d'un résultat encore paginé — l'en-tête affirmerait un ordre qui ne vaut que pour ce qui est à l'écran.

Le graphique et le tableau croisé dynamique portent alors sur le résultat entier — y compris sur les bases où le graphique n'existait pas. Si le figeage s'arrête avant la fin (vous avez cliqué sur Arrêter ou la limite a été atteinte), les lignes restent locales mais le graphique et le tableau croisé dynamique restent sur le serveur : sommer une partie du résultat donnerait un nombre faux — et trier la grille ne trie que les lignes récupérées, pas le résultat entier.

Actualiser défige et réexécute la requête. Indépendamment du figeage, les pages déjà passées par la grille sont conservées localement : revenir en arrière sur l'une d'elles n'interroge pas la base à nouveau. Un seul figeage tourne à la fois : avec deux résultats ouverts, cliquer sur Figer le résultat dans l’autre est refusé avec le motif, au lieu d’interrompre celui en cours — pour l’arrêter, utilisez Arrêter dans son propre onglet.

Grille de résultats : chaque requête qui renvoie des lignes reçoit un onglet au nom de sa table (le SQL complet est dans l'info-bulle de l'onglet). Une nouvelle exécution remplace ces onglets, sauf les épinglés — clic droit sur l'onglet, Épingler le résultat —, qui restent pour comparer ; le × ferme un résultat. À côté des onglets, le résumé de l'exécution indique combien de lignes sont arrivées et en combien de temps, ou l'erreur en rouge ; un clic ouvre les Messages. Le pied répète les lignes et le temps et, tant que le résultat est partiel, propose Charger le bloc suivant et Compter le total. La barre au-dessus de la grille regroupe le reste : Actualiser, Figer, Limite, le menu Analyse, Valeur, Colonnes et Exporter (avec Copier le SQL, Voir le SQL et Générer le SQL) ; dans une fenêtre étroite, les boutons perdent leur texte avant de disparaître. L'en-tête affiche le type de chaque colonne (texte, nombre, date…) et marque d'une clé les colonnes de la clé de la table ; la souris posée dessus donne le type en toutes lettres. Faire glisser l'en-tête réordonne les colonnes, et Colonnes (ou un clic droit sur l'en-tête) masque, affiche et ajuste la largeur au contenu — le choix survit à Actualiser, à la Limite et au tri.

Cellules : un NULL s'affiche en italique estompé, distinct d'un texte vide, et les nombres sont alignés à droite ; quand plusieurs cellules sont sélectionnées, le pied affiche le nombre de la sélection et, si elles sont numériques, la somme et la moyenne. Valeur (ou Voir la valeur dans le panneau dans le menu contextuel) ouvre à côté la valeur complète de la cellule sélectionnée, sans coupure, avec Formater pour embellir le JSON/XML à l'affichage seulement ; le bouton Enregistrement du panneau remplace la valeur par la ligne entière transposée — une colonne par ligne, avec le nom à côté de la valeur —, qui suit le curseur (aussi via Voir l'enregistrement entier, dans le menu de la cellule). Dans le menu d'une cellule, Filtrer par cette valeur / Exclure cette valeur réexécutent la requête avec un WHERE sur la cellule, et Aller à l'enregistrement référencé suit la clé étrangère de la colonne et interroge la table parente avec la valeur.

Rechercher et filtrer dans la grille : Ctrl+F, le focus sur la grille, mène au champ Rechercher dans la grille, qui n'affiche que les lignes contenant le texte dans n'importe quelle colonne — le focus dans l'éditeur, Ctrl+F reste la recherche du SQL. Le filtre à côté ouvre le Filtre avancé (conditions par colonne, avec ET/OU), et les colonnes filtrées reçoivent un entonnoir dans l'en-tête ; cliquer sur une barre du graphique, une cellule du tableau croisé dynamique ou une valeur fréquente de Qualité devient une sélection, une étiquette au-dessus de la grille qu'on retire avec son ×. Le pied indique combien de lignes restent sur combien. La recherche et le filtre portent sur le résultat entier, dans une copie locale : avec un résultat arrivé en entier, c'est immédiat ; avec seulement la première partie, le champ est grisé avec le motif — filtrer ce qui est à l'écran cacherait ce qui est dans la partie suivante — et Figer le débloque. Avec une recherche ou un filtre actif, le graphique, le tableau croisé dynamique et Qualité décrivent le même sous-ensemble que la grille. Rien de cela ne change la requête : pour restreindre dans la base, utilisez Filtrer par cette valeur ou écrivez le WHERE.

Graphique et tableau croisé dynamique : où le calcul est fait. Le menu Analyse contient le Graphique, le Tableau croisé dynamique, Qualité et l'Espace d'analyse, et sous Analyser sur le choix entre Données locales et Table entière (sur le serveur), coché sur celui qui s'applique. Quand le résultat tient entièrement dans la première page, la valeur par défaut est locale : LightNote agrège sur le résultat déjà affiché, sans retourner à la base à chaque changement d'axe, d'agrégat ou d'intervalle — et, comme le moteur local est DuckDB, le graphique existe désormais aussi sous Oracle, SQL Server, PostgreSQL et MySQL, où son SQL ne s'exécute pas sur le serveur. Quand le résultat est arrivé tronqué, l'option locale est indisponible avec le motif : agréger sur un échantillon donnerait un nombre faux, et prévenir de la coupure ne protégerait personne, car ce qu'on lit dans un graphique, c'est la hauteur de la barre. L'option serveur agrège sur la requête entière, avec une requête par ajustement, et est indisponible tant que la grille a une recherche ou un filtre (le sous-ensemble n'existe qu'ici). Les colonnes numériques que la base livre sous forme de texte — le cas du NUMBER d'Oracle — sont reconnues comme des nombres ; les identifiants avec un zéro initial, comme 01310, restent du texte. Sous Oracle, SQL Server, PostgreSQL et MySQL, avec un résultat encore partiel, Graphique est grisé avec le motif, et s'allume quand vous figez le résultat.

Qualité des données du résultat. L'élément Qualité du menu Analyse ouvre, à côté de la grille, le même profil par colonne que pour les tableaux de fichier. Il est calculé par DuckDB : sur la copie locale quand le résultat est arrivé en entier (ou a été figé), ou dans la base elle-même quand c'est DuckDB. Sous Oracle, SQL Server, PostgreSQL et les autres, tant que le résultat est partiel, le panneau dit pourquoi il ne le décrit pas et propose Figer le résultat sur place ; si le figeage s'arrête au plafond, il recommande de restreindre la requête — le profil d'une partie décrirait une autre table. Cliquer sur une valeur fréquente filtre la grille (c'est une sélection, comme la recherche) ; pour restreindre dans la base, utilisez Filtrer par cette valeur dans le menu de la cellule.

Sur combien de données l’analyse a porté. Au-dessus du graphique, du tableau croisé dynamique, de la qualité et de l’Espace d’analyse, une ligne indique si le calcul a utilisé toutes les données — avec le nombre de lignes, compté tout seul sur la copie locale — ou s’il a été fait dans la base, sur la requête entière ; là, le comptage est le lien Compter les lignes, car compter exécute la requête de nouveau. Quand le figeage s’est arrêté avant la fin et que la grille a une recherche ou un filtre, l’analyse ne peut porter que sur ce qui a été rapatrié, et la ligne indique Une partie des données, avec le ton d’avertissement. La même phrase figure dans la légende du rapport de l’Espace d’analyse.

Instantané des données : l'analyse d'un script enregistré garde les cartes à côté de lui, pas les données — pour la revoir, il faut la base. Le bouton Instantané des données de l'Espace d'analyse enregistre le résultat complet dans un fichier Parquet à côté du script, avec les cartes ; ouvrir ce fichier montre la même analyse sans connexion, sur les données de cet instant. C'est un geste explicite et la fenêtre prévient avant : le fichier est une copie des données de la base, et il part avec le dossier si celui-ci va dans Git ou est partagé. Il n'existe qu'avec le résultat complet ici — avec seulement la première partie, figez-le d'abord (l'info-bulle du bouton l'indique).

Plan d'exécution : l'élément Plan d'exécution du menu d'Exécuter demande le plan de l'instruction sous le curseur (SQLite, DuckDB, PostgreSQL et MySQL) et l'affiche dans l'onglet Plan : l'arbre des étapes, la plus lourde mise en avant, et une phrase qui dit ce qu'elle signifie — dans PostgreSQL et MySQL, l'étape au coût propre le plus élevé (son coût moins celui des étapes qu'elle contient), avec sa part du total ; dans DuckDB, celle qui produit le plus de lignes ; dans SQLite, qui n'indique pas de coût, la lecture d'une table entière. Quand l'étape lit la table entière dans une base qui a des index, la phrase rappelle qu'un index sur la colonne filtrée l'évite généralement (dans DuckDB, en colonnes, lire la table entière est normal et le conseil n'apparaît pas). L'alias de la requête (FROM commandes c) est remplacé par le nom de la table. Voir en texte montre le même arbre indenté, et Copier le plan le copie. Les chiffres sont l'estimation du planificateur : la requête n'est pas exécutée. Un EXPLAIN saisi s'ouvre aussi dans l'onglet Plan quand LightNote reconnaît la réponse ; ce qu'il ne reconnaît pas reste dans la grille. Dans les bases qui n'exposent pas le plan en une seule instruction (SQL Server, Oracle), l'élément est désactivé, avec la raison dans l'infobulle.

Analyser avec l'IA : la mise en évidence dit quelle étape pèse ; le bouton Analyser avec l'IA de l'onglet Plan demande pourquoi le planificateur l'a choisie et quoi changer. La requête, le plan et le schéma des tables lues sont envoyés — avec les index qui existent déjà, pour que l'IA ne suggère pas d'en créer un qui est déjà là. Les valeurs sont retirées avant l'envoi (le texte entre guillemets et les nombres deviennent ? ; les commentaires disparaissent), et Voir ce qui sera envoyé montre exactement ce qui part. La suggestion s'ouvre dans l'éditeur comme nouveau script, et rien n'est exécuté.

Le schéma

Données d'une table : double-cliquez sur une table dans l'arbre du schéma pour ouvrir son onglet sur le sous-onglet Données. Au-dessus de la grille se trouvent deux champs, WHERE et ORDER BY, appliqués avec Entrée — et les deux vont à la base : ils valent pour toute la table, pas seulement pour les lignes à l'écran. Cliquer sur l'en-tête d'une colonne trie aussi dans la base (croissant, décroissant, sans tri) et remplit le ORDER BY ; Filtrer par cette valeur dans le menu d'une cellule ajoute la condition au WHERE, visible et modifiable. L'onglet a sa propre session avec la base, comme un onglet de script. Ouvrir la table par Propriétés n'interroge pas les données : la requête ne s'exécute que lorsque le sous-onglet Données est affiché. Avec ORDER BY vide, les lignes arrivent dans l'ordre de la clé primaire (le champ indique laquelle) : sans aucun ordre, la base ne garantit pas la même séquence d'une page à la suivante, et le défilement pouvait répéter ou sauter des lignes. En triant par l'en-tête, la clé départage les lignes de même valeur.

Modifier les données : dans la grille d'une table qui a une clé primaire (ou unique, sur des colonnes NOT NULL), double-cliquez sur une cellule, appuyez sur F2 ou commencez à taper. L'éditeur suit le type de la colonne : une date avec calendrier, vrai/faux dans une liste, un nombre qui n'accepte que des nombres, et du JSON vérifié à la validation. Un texte effacé devient un texte vide, pas NULL : NULL est un geste à part (Définir comme NULL dans le menu de la cellule, ou le bouton NULL du panneau de valeur, qui modifie aussi les textes longs). Inser ajoute une nouvelle ligne — ce qui reste par défaut reçoit la valeur par défaut de la base —, Dupliquer la ligne copie celle sélectionnée sauf la clé, et Suppr marque les lignes pour suppression (une seconde fois, les démarque). Rien de tout cela ne part tout de suite dans la base : les modifications restent en attente, colorées dans la grille (ambre pour modifiée, vert pour nouvelle, rouge barré pour supprimée), et une bande au-dessus les compte. Vérifier… montre le SQL qui sera exécuté et le copie comme script ; Enregistrer écrit tout en une seule transaction, en vérifiant que chaque UPDATE et DELETE touche exactement une ligne — si une ligne a été modifiée ou supprimée par une autre session après sa lecture, ou si une instruction échoue, rien n'est écrit et les modifications restent dans la grille ; Abandonner les annule toutes. Recharger la grille, changer le filtre ou fermer l'onglet avec des modifications en attente demande d'abord.

Quand la grille ne modifie pas, elle dit pourquoi — dans l'infobulle des boutons et dans une bande quand on essaie de modifier. Une table sans clé primaire ni clé unique sur des colonnes NOT NULL reste en lecture seule : sans la clé, impossible de savoir quelle ligne chaque modification changerait. Dans un onglet de script, le résultat se modifie aussi quand la requête est un SELECT d'une seule table qui liste ses colonnes (ou utilise SELECT *) et renvoie la clé ; jointure, sous-requête, colonne calculée ou renommée, DISTINCT, GROUP BY et UNION laissent le résultat en lecture seule. Les colonnes binaires ne se modifient pas dans la grille. Et avec une transaction ouverte dans l'onglet (autocommit désactivé) contenant des instructions en attente, validez ou annulez avant d'enregistrer : enregistrer la grille les emporterait avec elle.

Propriétés de l'objet : F4 sur une table de l'arbre du schéma (ou Propriétés dans le menu contextuel) ouvre son onglet directement sur la structure ; à côté de Données, il y a quatre sous-onglets : Colonnes (n°, nom, type, nullité, valeur par défaut et une icône de clé sur les colonnes de la clé primaire), Clés (contraintes de clé primaire, étrangère, unique et check ; un double-clic sur une clé étrangère ouvre la table référencée), Index et DDL — le CREATE TABLE de l'objet, prêt à copier, enregistrer comme .sql ou ouvrir dans un onglet modifiable. Lorsque la base ne fournit pas le DDL tout fait (PostgreSQL et SQL Server n'ont pas cette commande), LightNote le reconstruit à partir des métadonnées — de même lorsque la commande de DDL est refusée faute de permission — et l'indique clairement dans l'onglet. Si même le catalogue des colonnes ne peut être lu (pas de permission ou catalogue indisponible), il n'y a rien à reconstruire : l'onglet le signale au lieu de rester silencieusement vide. Le menu contextuel de la table propose aussi Copier le DDL sans ouvrir l'onglet.

Arborescence des objets : dans le panneau Connexions, sous la liste, l'arborescence de la connexion sélectionnée sépare les Tables des Vues (chacune avec son icône) et marque d'une clé les colonnes de la clé primaire. L'arbre affiche aussi les Procédures et fonctions, les Déclencheurs et les Séquences (là où la base en a) ; un double-clic sur une procédure, une fonction ou un déclencheur ouvre son code source dans une console SQL de la connexion. À côté de chaque table figure le nombre approximatif de lignes, et son commentaire est dans l'infobulle — c'est l'estimation que garde la base, pas un COUNT(*). Les schémas système (SYS, pg_catalog…) sont masqués ; l'élément en fin de liste les affiche. Le champ de filtre trie tout de suite ce qui est déjà chargé et, dès 2 lettres, cherche aussi dans la base : ce que personne n'a déplié apparaît dans le dossier Dans la base en haut. Dans un script, Ctrl+Alt+O (Aller à la table…, dans le sélecteur de connexion) ouvre la recherche au clavier, et F12 sur le nom d'une table ouvre son onglet.

Actualiser les métadonnées. Après un CREATE, ALTER, DROP ou RENAME exécuté dans un script, l’arbre, la complétion et les propriétés de la table relisent tables, colonnes et types tout seuls, quelques secondes plus tard — sans refermer ce qui était ouvert dans l’arbre. Avec l’autocommit désactivé, la relecture attend le Commit (ou le Rollback), car avant cela la modification n’existe pas encore pour les autres sessions. Quand la structure a changé ailleurs (un autre programme, une migration), utilisez le bouton Actualiser les métadonnées dans la barre du script, dans le menu de la connexion, à côté du filtre de l’arbre ou l’Actualiser des propriétés de la table.

Explorer le schéma : Faites un clic droit sur une table pour Insérer un SELECT dans l'éditeur, Afficher les données, Compter les lignes, Copier le nom qualifié ou ouvrir le sous-menu Générer du SQL → INSERT/UPDATE/MERGE : un écran liste les colonnes de la table pour que vous puissiez cocher Inclure et Clé, affiche un aperçu en direct et dépose la commande dans l'éditeur (MERGE sort en ANSI ; si le pilote ne le prend pas en charge, un avertissement apparaît). Directement sur la grille de résultats, le bouton Générer du SQL de la barre du bas construit un INSERT/UPDATE/DELETE pré-rempli avec les valeurs de la ligne sélectionnée (disponible quand la requête est un SELECT de table unique). Les noms de table et de colonne que vous parcourez dans l'arborescence commencent aussi à apparaître dans l'autocomplétion (Ctrl+Espace) des éditeurs .sql de la connexion, sans requêtes supplémentaires à la base.

Diagramme ER : dans le menu contextuel du dossier Tables, Diagramme ER des tables les dessine toutes ; dans celui d'une table, Diagramme ER (cette table et celles qu'elle référence) dessine celle-ci et les tables que ses clés étrangères désignent. Le résultat est une note dans Dictionnaire de données avec un bloc mermaid erDiagram — colonnes avec leur type, PK/FK, et chaque clé étrangère comme relation (facultative quand la colonne accepte NULL, un à un quand la clé est la clé primaire elle-même). C'est du texte dans la note : il se versionne dans Git et s'édite comme n'importe quel diagramme. Au-delà de 40 tables, les autres sont laissées de côté, et la note dit combien.

Importer un fichier dans une table : Importer un fichier dans une table… (dans le menu de la connexion et dans celui du dossier Tables) et Importer un fichier dans cette table… (dans celui d'une table) amènent un CSV, un TSV ou un classeur Excel dans la base — le chemin retour d'Exporter le résultat. La fenêtre montre un aperçu avec le type lu pour chaque colonne : un type ne vaut que si toutes les cellules correspondent (entier sans zéro initial — 01310 est un code et reste du texte —, décimal avec point ou avec virgule, date ISO, vrai/faux) ; une date jj/mm/aaaa reste du texte, car le mois peut venir en premier. Une cellule vide devient NULL. Le séparateur est détecté comme dans la vue tableau. Créer la table utilise le nom du fichier ; Ajouter à la table vérifie d'abord que les colonnes du fichier y existent. Tout passe dans une seule transaction : si une ligne échoue, rien ne reste — et la table créée par cette importation est supprimée. Les verrous valent ici aussi : une connexion en lecture seule refuse, et une connexion de production demande d'abord. Sur une connexion DuckDB, le CSV est lu directement par la base, sans limite de lignes ; sur les autres, la limite est de 100 000 lignes.

Export, variables et transactions

Exporter les résultats : faites un clic droit sur la grille de résultats et choisissez Exporter le résultat... pour écrire en CSV (délimiteur, caractère de quote, toujours mettre entre quotes, ligne d'en-tête, texte NULL), JSON Lines ou SQL (instructions INSERT avec un nom de table), avec une limite de lignes facultative. L'export parcourt la requête entière en mode streaming (re-fetch paginé), pas seulement ce qui est visible à l'écran.

Résultat dans la note du jour : dans le menu Exporter de la grille, Ajouter à la note du jour reprend le tableau tel qu'il est à l'écran — les colonnes visibles, dans l'ordre de la grille, avec la recherche et le filtre — et, juste en dessous, la requête dans un bloc sql : la note garde d'où vient le chiffre. NULL apparaît comme NULL, les nombres sont alignés à droite, et une ligne en italique indique quand le tableau n'est pas le résultat complet (les 200 premières lignes, ou seulement celles déjà chargées).

Variables de script : écrivez @set nom = valeur sur une ligne du script pour définir une variable — le préfixe @ la tient à l'écart de la base (pas de conflit avec le vrai SET de Postgres/DuckDB/SQL Server). Les références :nom sont remplacées avant l'exécution (hors chaînes et commentaires ; le cast ::type et les binds comme :1 restent intacts) ; un :nom sans valeur ouvre une invite avant l'exécution. L'élément Variables… du menu d'Exécuter ouvre l'écran des variables déjà définies (modifier/ajouter/supprimer).

Paramètres : quand vous exécutez une instruction avec :nom — ou avec ?, ?1, ?2, sauf sous PostgreSQL, où ? est un opérateur JSON —, la fenêtre Paramètres de la requête montre l'instruction et tous ses paramètres déjà remplis avec la dernière valeur utilisée, et la liste de chacun garde les valeurs précédentes : relancer avec une autre valeur, c'est changer un champ. La valeur est insérée telle quelle dans le SQL, donc le texte va entre apostrophes ('abc'). Ce que le script définit avec @set n'est pas demandé. Décochez Demander à chaque exécution pour que l'onglet utilise les dernières valeurs sans demander ; pour les changer ensuite, utilisez Variables….

Historique des requêtes : l'élément Historique… du menu d'Exécuter ouvre une fenêtre avec les dernières instructions exécutées avec succès sur cette connexion, dans les colonnes SQL / Quand / Durée / Lignes. Sélectionnez-en une pour Réexécuter, Insérer dans l'éditeur ou Copier (le double-clic insère), ou utilisez Effacer l'historique. Il est gardé uniquement sur la machine locale (ni dans Git ni dans le .lnc).

Historique de toutes les connexions : dans la fenêtre de l'historique, cochez Toutes les connexions pour voir les requêtes de toutes les bases, de la plus récente à la plus ancienne, avec la colonne de la connexion, et chercher dans toutes par le champ de filtre. Réexécuter ne vaut que pour les requêtes de cette connexion ; celles d'une autre s'insèrent dans l'éditeur, pour que vous les exécutiez sur la bonne base.

Transactions : l'option Autocommit (activée par défaut) se trouve dans le menu d'Exécuter. Désactivée, les modifications restent en attente jusqu'à ce que vous les validiez (Commit) ou les annuliez (Rollback), et la barre de l'onglet affiche Transaction · N en attente, avec les deux commandes. Fermer l'onglet, changer de connexion ou se déconnecter avec une transaction ouverte demande quoi faire.

Index

Édition

Outils

Automatisation (IA / scripts)

Référence