Datenbanken (.lnc)

Video ansehenDaten analysieren 00:23

Die Verbindung

Eine Verbindung ist eine .lnc-Datei (LightNote Connection) im Arbeitsbereich selbst — versionierbar in Git und zwischen Rechnern übertragbar. Die Verbindungen des Ordners erscheinen im Bereich Verbindungen der Seitenleiste (das Datenbanksymbol), jede mit einem Statuspunkt (grün verbunden, grau getrennt, rot mit Fehler) und darunter den Skripten, die zu ihr gehören. Lege eine mit Neu → Neue DB-Verbindung oder mit der Schaltfläche des Bereichs an; eine .lnc aus dem Dateibaum zu öffnen führt ebenfalls zum Bereich. Unter der Liste steht der Objektbaum der ausgewählten Verbindung. Das Kontextmenü der Verbindung bietet Verbinden/Trennen, Neues Skript, SQL-Konsole und Verbindung bearbeiten.

Ordner ohne Verbindung: Der leere Bereich Verbindungen bietet Neue Verbindung… und Datenbankdatei öffnen… an und listet die SQLite- und DuckDB-Datenbankdateien, die schon im Ordner liegen, jede mit einem Verbinden. Die Datenbank wird am Inhalt der Datei erkannt, nicht an der Endung (eine .db kann beides sein); ein Klick legt die Verbindung (.lnc) neben der Datei an, die sie über den Namen findet — beide wandern zusammen — und verbindet sofort.

Skripte: ein Skript ist eine gewöhnliche .sql-Datei und öffnet sich im Code-Tab wie jede Datei — mit Verlauf, Änderungsleiste und Version speichern. Am Anfang der Leiste des Tabs stehen die Verbindungsauswahl und die Schaltfläche Ausführen; die Ergebnisse erscheinen beim ersten Ausführen unter dem Editor (oder daneben: Ausführen → Ergebnisse daneben). Die Herkunftsverbindung des Skripts wird in der .lnc gespeichert, und beim erneuten Öffnen zeigt das Skript schon auf sie. Eine andere Verbindung in der Auswahl gilt nur für diesen Tab; um die Herkunft zu ändern, nutze Für dieses Skript immer „…“ verwenden. Ein Skript ohne Herkunft öffnet mit Keine Verbindung, selbst wenn der Ordner nur eine Verbindung hat: Kein Skript öffnet auf eine Datenbank, die du nicht gewählt hast. Die SQL-Konsole ist ein Tab ohne Datei, schon mit der Verbindung verknüpft. Der Analysebereich eines Ergebnisses wird neben dem Skript gespeichert (abfrage.sql.analysis.json), einer pro Abfrage: Die Datei hält die Diagramme, die Pivot-Tabellen und das SQL jeder Abfrage — nie die Daten.

Eine Sitzung pro Tab: jeder Skript-Tab öffnet eine eigene Sitzung mit der Datenbank — eine lange Abfrage in einem Tab blockiert weder die anderen noch den Objektbaum, und ein Commit in einem Tab bestätigt nicht, was ein anderer getan hat. Temporäre Tabellen und SET-Befehle gelten nur in dem Tab, in dem sie liefen. Begrenzt der Server die Zahl der Verbindungen, deaktiviere Eine Sitzung pro Tab unter Verbindung bearbeiten. SQLite- und DuckDB-Dateien teilen sich immer dieselbe Sitzung (in SQLite sperrt ein Schreibvorgang die ganze Datei). Der Bereich zeigt, wie viele Sitzungen jede Verbindung offen hat.

Treiber: SQLite und DuckDB (Datei) nativ; PostgreSQL, MySQL/MariaDB, SQL Server und generisch über ODBC; natives Oracle (ohne ODBC). SQL Server verwendet Microsofts msodbcsql-Treiber (installiere ihn auf der Maschine) und bietet Windows-Authentifizierung oder Benutzer/Passwort, plus die Verschlüsselungs-Optionen für den Kanal (Encrypt / dem Zertifikat vertrauen). Lege für Oracle den Ordner des Oracle Instant Client unter Einstellungen → Datenbank fest — er wird zur Laufzeit geladen, ohne dass etwas installiert werden muss. Die Oracle-Verbindung hat vier Modi: Service Name (Host/Port/Dienst), SID (Host/Port/SID), TNS-Name (Alias aus der tnsnames.ora im Client-Ordner) und Vollständiger TNS-Deskriptor (in ein Textfeld eingefügt).

Passwort: Aktiviere Passwort speichern, um es innerhalb der .lnc selbst zu verschlüsseln (portable Kryptografie, öffnet sich auf einer anderen Maschine); deaktiviert wird das Passwort nicht gespeichert und bei jeder Verbindung abgefragt. Die Verschlüsselung verwendet eine Sicherheitsphrase pro Arbeitsbereich, festgelegt unter Hilfe → Sicherheitsphrase einrichten; bewahre sie sicher auf — ohne sie kann das Passwort nirgendwo anders geöffnet werden. Die Sicherheitsphrase wird nur auf der lokalen Maschine zwischengespeichert (sie gelangt nie ins Git).

Aktiviere Beim Öffnen verbinden, damit sich die Verbindung von selbst öffnet, wenn du eines ihrer Skripte öffnest. Die automatische Verbindung ist still: Muss das Passwort eingegeben werden (Modus „fragen“ oder verschlüsselt ohne zwischengespeicherte Sicherheitsphrase auf dem Rechner), öffnet das Skript getrennt, ohne dich zu unterbrechen.

Produktion ohne Angst: Unter Verbindung bearbeiten sagt das Feld Umgebung, welche Datenbank das ist — Entwicklung, Staging oder Produktion —, und ihre Farbe erscheint in der Verbindungsauswahl des .sql-Tabs, in einem Streifen oben im Tab und als Plakette im Bereich Verbindungen. Bei einer Produktionsverbindung zeigt alles, was die Datenbank ändert (INSERT, UPDATE, DELETE, CREATE, DROP, Prozeduren…), vorher, was laufen wird, und fragt nach — ein UPDATE/DELETE ohne WHERE ist hervorgehoben; die Standardschaltfläche ist Abbrechen, und das Speichern der Änderungen im Raster fragt genauso. Aktivieren Sie Schreibgeschützt, damit die Verbindung alles ablehnt, was die Datenbank ändert — im Skript, im Raster und in den Daten einer Tabelle —, bevor die Anweisung LightNote verlässt: Das Raster bietet keine Bearbeitung mehr an, und bei SQLite wird die Datei nur zum Lesen geöffnet. Was LightNote nicht als reines Lesen erkennen kann (ein BEGIN … END-Block, ein DECLARE), zählt als Schreiben.

SSH-Tunnel: Für eine Datenbank hinter einem SSH-Server (Bastion) wählen Sie unter SSH-Tunnel eine SSH-Verbindung (.lns) aus dem Arbeitsbereich — dieselbe wie im Remote-Terminal, mit Benutzer, Schlüssel oder verschlüsseltem Passwort. Host und Port sind dann die der Datenbank, vom SSH-Server aus gesehen (meist localhost). Beim Verbinden öffnet LightNote den Tunnel und erreicht die Datenbank darüber; Trennen schließt den Tunnel. Er startet nur, wenn Sie verbinden (nie beim Öffnen der Datei), die .lns muss im Arbeitsbereich liegen, und ssh-Optionen, die Befehle ausführen (ProxyCommand, LocalCommand, -F), werden abgelehnt — -J ist erlaubt. Nur Optionen aus einer Positivliste werden übernommen (-J, -i, -4/-6, -C und -o mit Schlüsseln für Verbindung, Verschlüsselung und Authentifizierung): -A, -R, -I und -E werden ebenfalls abgelehnt. Eine Verbindung mit Tunnel wird weder von der KI (MCP) noch von lnote oder den Blöcken geöffnet, die direkt verbinden würden.

Serverinformationen: Beim Verbinden fragt die App die Datenbank, was sie über sich meldet — die Version, die aktuelle Datenbank und das Schema, den Benutzer, die Größe, die Kodierung, die Sortierung und die Zeitzone und ob der Server Schreibzugriffe annimmt (ein Replikat tut das nicht). Die Version steht im Tooltip der Verbindung, der Rest unter Serverinformationen… im Kontextmenü der Verbindung, mit einer Schaltfläche zum Kopieren. Was der Server nicht meldet — ältere Version, fehlende Berechtigung — wird ohne Fehler weggelassen. Die Version wird mitgeschickt, wenn Sie die KI bitten, einen Fehler zu erklären oder einen Plan zu analysieren: Die Syntax, die sie vorschlagen kann, hängt davon ab.

Fremdschlüssel in SQLite: SQLite setzt die deklarierten Fremdschlüssel — und ON DELETE CASCADE — nur durch, wenn die Verbindung es verlangt, und die Verbindungen der App verlangen es: Das Löschen einer Zeile, auf die andere verweisen, oder das Einfügen eines Verweises auf einen nicht vorhandenen Datensatz wird abgelehnt, und CASCADE löscht die abhängigen Zeilen, wie das Schema es vorsieht. Das Kästchen Fremdschlüssel prüfen unter Verbindung bearbeiten… schaltet das aus — nur für einen Massenimport in beliebiger Reihenfolge. Das Einschalten prüft nicht, was schon in der Datei steht: Serverinformationen… zählt pro Tabelle die bereits vorhandenen defekten Verweise (Zeilen, die auf einen nicht vorhandenen Datensatz zeigen), geschrieben von einem Werkzeug, das sie nicht prüfte.

Ausführen und das Ergebnis ansehen

Ausführen: Strg+Enter führt die Anweisung unter dem Cursor aus und Alt+X führt das ganze Skript aus; die Ergebnisse erscheinen seitenweise, jedes in einem Ergebnis-Tab mit einer Aktionsleiste unten: Nächsten Block holen, Ergebnis einfrieren, Gesamtanzahl, das Zeilen-Limit ändern, Aktualisieren (führt erneut aus), SQL ansehen/kopieren, Exportieren... und SQL generieren aus der ausgewählten Zeile. Was eine Anweisung ist, ergibt sich aus dem Text selbst: Ein Block BEGIN … END und ein Rumpf $$ … $$ bleiben ganz, und eine Zeile nur mit / (Oracle) oder GO (SQL Server) trennt ebenfalls.

SQL mit Hilfe schreiben: Strg+Leertaste vervollständigt nach dem Kontext: nach FROM, JOIN, UPDATE oder INTO kommen die Tabellen der Datenbank (die Liste öffnet sich von selbst, wenn Sie das Leerzeichen tippen), und nach Alias. kommen die Spalten dieser Tabelle (öffnet sich beim Tippen des Punkts) — schon bevor das FROM geschrieben ist und ohne etwas im Baum aufzuklappen: LightNote liest den Katalog der Datenbank im Hintergrund und die Spalten erst, wenn der Text sie erreicht. In einem Skript mit mehreren Anweisungen wird die hervorgehoben, die Strg+Enter ausführen wird. Schlägt eine Anweisung fehl, wird sie im Editor markiert, der Name, auf den die Datenbank zeigt (die Tabelle oder Spalte, die es nicht gibt, die Stelle des Syntaxfehlers), bekommt eine Wellenlinie, der Cursor springt dorthin, und die Meldung erscheint, wenn die Maus darauf ruht. Strg+Klick oder F12 auf einen Tabellennamen öffnet deren Daten; F4 die Eigenschaften. Formatieren (Umschalt+Alt+F) ordnet das SQL ohne installiertes Werkzeug: eine Klausel pro Zeile, die Elemente des SELECT je Zeile, wenn es mehrere sind, AND/OR und Unterabfragen eingerückt. Es ändert nur Leerraum und die Schreibweise der Schlüsselwörter, nie einen Namen, einen Text oder einen Kommentar, und lässt Anweisungen, die keine Abfragen sind (CREATE, BEGIN … END-Blöcke), wie sie sind.

Ergebnis einfrieren: liest das gesamte Ergebnis in einem Durchgang aus der Datenbank und legt es in einer lokalen Tabelle ab (auf der Festplatte, falls es nicht in den Arbeitsspeicher passt). Danach scrollt das Raster ohne Datenbankabfrage, die Zeilenzahl ist exakt (ohne Gesamtzahl zählen), ein Klick auf eine Spaltenüberschrift sortiert (ein weiterer Klick kehrt um, ein dritter stellt die Reihenfolge wieder her, in der die Datenbank geliefert hat), und auch der Export liest aus der lokalen Kopie. Das Sortieren über die Spaltenüberschrift gilt bis 100.000 Zeilen; darüber wird es abgelehnt, mit der Begründung im Tooltip der Überschrift, denn jede Seite müsste die gesamte Kopie neu sortieren und das Durchblättern des Rasters würde wieder Minuten dauern. Ein Ergebnis, das bereits vollständig auf der ersten Seite ankam, lässt sich ohne Einfrieren sortieren: die Zeilen liegen schon im Arbeitsspeicher. Nicht sortiert wird der erste Teil eines noch seitenweise geladenen Ergebnisses — die Spaltenüberschrift würde eine Reihenfolge behaupten, die nur für das gilt, was auf dem Bildschirm steht.

Diagramm und Pivot-Tabelle gelten dann für das ganze Ergebnis — auch in Datenbanken, in denen es das Diagramm bisher nicht gab. Bricht das Einfrieren vorzeitig ab (Sie haben Anhalten geklickt oder die Obergrenze wurde erreicht), bleiben die Zeilen lokal, Diagramm und Pivot-Tabelle aber auf dem Server: eine Summe über einen Teil des Ergebnisses ergäbe eine falsche Zahl — und das Sortieren des Rasters sortiert nur die geholten Zeilen, nicht das gesamte Ergebnis.

Aktualisieren taut auf und führt die Abfrage erneut aus. Unabhängig vom Einfrieren werden die Seiten, die bereits durch das Raster gelaufen sind, lokal behalten: zurück zu einer von ihnen zu scrollen fragt die Datenbank nicht erneut ab. Es läuft immer nur ein Einfrieren: Sind zwei Ergebnisse offen, wird Ergebnis einfrieren im anderen mit Begründung abgelehnt, statt das laufende abzubrechen — zum Beenden nutzen Sie Anhalten in dessen eigenem Tab.

Ergebnisraster: Jede Abfrage, die Zeilen liefert, bekommt einen Tab mit dem Namen der Tabelle (das ganze SQL steht im Tooltip des Tabs). Eine neue Ausführung ersetzt diese Tabs, außer den angehefteten — Rechtsklick auf den Tab, Ergebnis anheften —, die zum Vergleichen bleiben; das × schließt ein Ergebnis. Neben den Tabs sagt die Zusammenfassung der Ausführung, wie viele Zeilen kamen und wie lange es dauerte, oder den Fehler in Rot; ein Klick darauf öffnet die Meldungen. Die Fußzeile wiederholt Zeilen und Zeit und bietet, solange das Ergebnis unvollständig ist, Nächsten Block holen und Gesamtzahl zählen an. Die Leiste über dem Raster fasst den Rest zusammen: Aktualisieren, Einfrieren, Limit, das Menü Analyse, Wert, Spalten und Exportieren (mit SQL kopieren, SQL ansehen und SQL generieren); in einem schmalen Fenster verlieren die Schaltflächen ihren Text, bevor sie verschwinden. Die Kopfzeile zeigt den Typ jeder Spalte (Text, Zahl, Datum…) und markiert die Schlüsselspalten der Tabelle mit einem Schlüssel; mit der Maus darüber erscheint der Typ ausgeschrieben. Das Ziehen der Kopfzeile ordnet die Spalten neu, und Spalten (oder ein Rechtsklick auf die Kopfzeile) blendet aus, zeigt an und passt die Breite dem Inhalt an — die Wahl übersteht Aktualisieren, Limit und Sortierung.

Zellen: Ein NULL erscheint in blasser Kursivschrift, verschieden von einem leeren Text, und Zahlen stehen rechtsbündig; bei mehreren ausgewählten Zellen zeigt die Fußzeile die Anzahl der Auswahl und, wenn sie numerisch sind, Summe und Mittelwert. Wert (oder Wert im Bereich anzeigen im Kontextmenü) öffnet daneben den vollständigen Wert der ausgewählten Zelle, ungekürzt, mit Formatieren, um JSON/XML nur in der Anzeige aufzubereiten; die Schaltfläche Datensatz im Bereich tauscht den Wert gegen die ganze Zeile transponiert — eine Spalte pro Zeile, mit dem Namen neben dem Wert —, die dem Cursor folgt (auch über Ganzen Datensatz anzeigen im Zellenmenü). Im Menü einer Zelle führen Nach diesem Wert filtern / Diesen Wert ausschließen die Abfrage mit einem WHERE für die Zelle erneut aus, und Zum referenzierten Datensatz folgt dem Fremdschlüssel der Spalte und fragt die übergeordnete Tabelle nach dem Wert ab.

Im Raster suchen und filtern: Strg+F mit dem Fokus im Raster springt in das Feld Im Raster suchen, das nur die Zeilen zeigt, die den Text in einer beliebigen Spalte enthalten — mit dem Fokus im Editor bleibt Strg+F die Suche im SQL. Der Trichter daneben öffnet den Erweiterten Filter (Bedingungen pro Spalte, mit UND/ODER), und gefilterte Spalten bekommen einen Trichter in der Kopfzeile; ein Klick auf einen Diagrammbalken, eine Zelle der Pivot-Tabelle oder einen häufigen Wert in Qualität wird zu einer Auswahl, einem Etikett über dem Raster, das sich mit seinem × entfernen lässt. Die Fußzeile sagt, wie viele Zeilen von wie vielen übrig sind. Suchen und Filtern gelten für das ganze Ergebnis, in einer lokalen Kopie: Bei einem vollständig gelieferten Ergebnis geht es sofort; mit nur dem ersten Teil ist das Feld grau, mit dem Grund — das Gezeigte zu filtern würde verbergen, was im nächsten Teil steht —, und Einfrieren gibt es frei. Mit aktiver Suche oder aktivem Filter beschreiben Diagramm, Pivot-Tabelle und Qualität denselben Ausschnitt wie das Raster. Nichts davon ändert die Abfrage: Um in der Datenbank einzuschränken, nutzen Sie Nach diesem Wert filtern oder schreiben das WHERE.

Diagramm und Pivot-Tabelle: wo gerechnet wird. Das Menü Analyse enthält das Diagramm, die Pivot-Tabelle, Qualität und den Analysebereich, und unter Analysieren über die Wahl zwischen Lokale Daten und Ganze Tabelle (auf dem Server), markiert bei der geltenden. Wenn das Ergebnis vollständig auf die erste Seite passte, ist lokal die Vorgabe: LightNote aggregiert über das bereits angezeigte Ergebnis, ohne bei jeder Änderung von Achse, Aggregat oder Intervall erneut die Datenbank zu befragen — und da die lokale Engine DuckDB ist, gibt es das Diagramm nun auch bei Oracle, SQL Server, PostgreSQL und MySQL, wo sein SQL nicht auf dem Server läuft. Kam das Ergebnis abgeschnitten, ist die lokale Option mit Begründung nicht verfügbar: Über eine Stichprobe zu aggregieren ergäbe eine falsche Zahl, und ein Hinweis auf den Schnitt schützte niemanden, denn in einem Diagramm liest man die Höhe des Balkens. Die Server-Option aggregiert über die ganze Abfrage, mit einer Abfrage pro Anpassung, und ist nicht verfügbar, solange das Raster eine Suche oder einen Filter hat (der Ausschnitt existiert nur hier). Numerische Spalten, die die Datenbank als Text liefert — der Fall von Oracles NUMBER —, werden als Zahlen erkannt; Kennungen mit führender Null wie 01310 bleiben Text. Bei Oracle, SQL Server, PostgreSQL und MySQL ist Diagramm, solange das Ergebnis unvollständig ist, mit Begründung ausgegraut und wird aktiv, sobald Sie das Ergebnis einfrieren.

Datenqualität des Ergebnisses. Der Eintrag Qualität im Menü Analyse öffnet neben dem Raster dasselbe spaltenweise Profil wie bei Dateitabellen. Es wird von DuckDB berechnet: auf der lokalen Kopie, wenn das Ergebnis vollständig kam (oder eingefroren wurde), oder in der Datenbank selbst, wenn sie DuckDB ist. Bei Oracle, SQL Server, PostgreSQL und den übrigen, solange das Ergebnis unvollständig ist, sagt das Panel, warum es nicht beschreibt, und bietet gleich dort Ergebnis einfrieren an; endet das Einfrieren an der Obergrenze, empfiehlt es, die Abfrage einzuschränken — das Profil eines Teils beschriebe eine andere Tabelle. Ein Klick auf einen häufigen Wert filtert das Raster (eine Auswahl, wie bei der Suche); um in der Datenbank einzuschränken, nutzen Sie Nach diesem Wert filtern im Zellenmenü.

Auf wie vielen Daten die Analyse beruht. Über dem Diagramm, der Pivot-Tabelle, der Qualität und dem Analysebereich sagt eine Zeile, ob die Berechnung alle Daten verwendet hat — mit der Zeilenzahl, die in der lokalen Kopie von selbst gezählt wird — oder in der Datenbank über die ganze Abfrage berechnet wurde; dort ist das Zählen der Link Zeilen zählen, weil Zählen die Abfrage erneut ausführt. Wenn das Einfrieren vor dem Ende angehalten hat und im Raster eine Suche oder ein Filter aktiv ist, kann die Analyse nur das Geholte abdecken, und die Zeile sagt Teil der Daten, im Warnton. Derselbe Satz steht in der Legende des Berichts des Analysebereichs.

Daten-Snapshot: Die Analyse eines gespeicherten Skripts bewahrt die Karten neben ihm auf, nicht die Daten — um sie wieder zu sehen, braucht es die Datenbank. Die Schaltfläche Daten-Snapshot im Analysebereich speichert das ganze Ergebnis in einer Parquet-Datei neben dem Skript, zusammen mit den Karten; wer diese Datei öffnet, sieht dieselbe Analyse ohne Verbindung, auf den Daten dieses Moments. Es ist eine ausdrückliche Geste, und das Fenster warnt vorher: Die Datei ist eine Kopie der Datenbankdaten und geht mit, wenn der Ordner in Git landet oder geteilt wird. Sie gibt es nur mit dem ganzen Ergebnis hier — mit nur dem ersten Teil frieren Sie es vorher ein (der Tooltip der Schaltfläche sagt das).

Ausführungsplan: der Eintrag Ausführungsplan im Menü von Ausführen fordert den Plan der Anweisung unter dem Cursor an (SQLite, DuckDB, PostgreSQL und MySQL) und zeigt ihn im Tab Plan: den Baum der Schritte, den gewichtigsten hervorgehoben, und einen Satz, was er bedeutet — in PostgreSQL und MySQL der Schritt mit den höchsten eigenen Kosten (seine Kosten minus die der Schritte darin), mit seinem Anteil am Ganzen; in DuckDB der, der die meisten Zeilen erzeugt; in SQLite, das keine Kosten nennt, das Lesen einer ganzen Tabelle. Liest der Schritt die ganze Tabelle in einer Datenbank mit Indizes, erinnert der Satz daran, dass ein Index auf der gefilterten Spalte das meist vermeidet (in DuckDB, spaltenorientiert, ist das Lesen der ganzen Tabelle normal, und der Hinweis erscheint nicht). Der Alias der Abfrage (FROM bestellungen b) wird durch den Tabellennamen ersetzt. Als Text anzeigen zeigt denselben Baum eingerückt, und Plan kopieren kopiert ihn. Die Zahlen sind die Schätzung des Planers: Die Abfrage wird nicht ausgeführt. Ein getipptes EXPLAIN öffnet ebenfalls im Tab Plan, wenn LightNote die Antwort erkennt; was es nicht erkennt, bleibt im Raster. In Datenbanken, die den Plan nicht in einer einzigen Anweisung liefern (SQL Server, Oracle), ist der Eintrag deaktiviert, mit dem Grund im Tooltip.

Mit KI analysieren: Die Hervorhebung sagt, welcher Schritt teuer ist; die Schaltfläche Mit KI analysieren im Tab Plan fragt, warum der Planer ihn gewählt hat und was zu ändern ist. Gesendet werden die Abfrage, der Plan und das Schema der Tabellen, die er liest — mit den schon vorhandenen Indizes, damit die KI keinen vorschlägt, den es schon gibt. Die Werte werden vor dem Senden entfernt (Text in Anführungszeichen und Zahlen werden zu ?; Kommentare fallen weg), und Anzeigen, was gesendet wird zeigt genau, was geht. Der Vorschlag öffnet sich im Editor als neues Skript, und nichts wird ausgeführt.

Das Schema

Daten einer Tabelle: Ein Doppelklick auf eine Tabelle im Schemabaum öffnet ihren Tab im Unter-Tab Daten. Über dem Raster stehen zwei Felder, WHERE und ORDER BY, die mit Enter angewendet werden — beide gehen an die Datenbank und gelten daher für die ganze Tabelle, nicht nur für die Zeilen auf dem Bildschirm. Ein Klick auf eine Spaltenüberschrift sortiert ebenfalls in der Datenbank (aufsteigend, absteigend, unsortiert) und füllt das ORDER BY; Nach diesem Wert filtern im Menü einer Zelle fügt die Bedingung dem WHERE hinzu, sichtbar und bearbeitbar. Der Tab hat eine eigene Sitzung mit der Datenbank, wie ein Skript-Tab. Wird die Tabelle über Eigenschaften geöffnet, werden die Daten nicht abgefragt: Die Abfrage läuft erst, wenn der Unter-Tab Daten angezeigt wird. Ist ORDER BY leer, kommen die Zeilen in der Reihenfolge des Primärschlüssels (das Feld zeigt, welcher): ganz ohne Reihenfolge garantiert die Datenbank nicht dieselbe Abfolge von einer Seite zur nächsten, und beim Scrollen konnten Zeilen doppelt erscheinen oder fehlen. Beim Sortieren über die Spaltenüberschrift entscheidet der Schlüssel bei gleichen Werten.

Daten bearbeiten: Im Raster einer Tabelle mit Primärschlüssel (oder eindeutigem Schlüssel aus NOT-NULL-Spalten) eine Zelle doppelt anklicken, F2 drücken oder einfach tippen. Der Editor passt zum Typ der Spalte: ein Datum mit Kalender, wahr/falsch in einer Liste, ein Zahlenfeld, das nur Zahlen annimmt, und JSON, das beim Bestätigen geprüft wird. Gelöschter Text wird zu leerem Text, nicht zu NULL: NULL ist eine eigene Geste (Auf NULL setzen im Menü der Zelle oder die Schaltfläche NULL im Wertebereich, der auch lange Texte bearbeitet). Einfg fügt eine neue Zeile hinzu — was auf Standard bleibt, erhält den Standardwert der Datenbank —, Zeile duplizieren kopiert die ausgewählte ohne den Schlüssel, und Entf markiert Zeilen zum Löschen (erneut hebt die Markierung auf). Nichts davon geht sofort an die Datenbank: Die Änderungen bleiben ausstehend, im Raster eingefärbt (Bernstein für geändert, Grün für neu, durchgestrichenes Rot für gelöscht), und eine Leiste darüber zählt sie. Prüfen… zeigt das SQL, das ausgeführt wird, und kopiert es als Skript; Speichern schreibt alles in einer einzigen Transaktion und prüft, dass jedes UPDATE und DELETE genau eine Zeile trifft — wurde eine Zeile nach dem Lesen von einer anderen Sitzung geändert oder gelöscht, oder schlägt eine Anweisung fehl, wird nichts geschrieben und die Änderungen bleiben im Raster; Verwerfen macht alle rückgängig. Das Raster neu laden, den Filter ändern oder den Tab mit ausstehenden Änderungen schließen fragt vorher nach.

Wenn das Raster nicht bearbeitet, sagt es, warum — im Tooltip der Schaltflächen und in einer Leiste beim Bearbeitungsversuch. Eine Tabelle ohne Primärschlüssel und ohne eindeutigen Schlüssel aus NOT-NULL-Spalten bleibt schreibgeschützt: Ohne Schlüssel lässt sich nicht bestimmen, welche Zeile eine Bearbeitung ändern würde. In einem Skript-Tab ist das Ergebnis ebenfalls bearbeitbar, wenn die Abfrage ein SELECT aus einer einzigen Tabelle ist, das deren Spalten auflistet (oder SELECT * verwendet) und den Schlüssel enthält; Join, Unterabfrage, berechnete oder umbenannte Spalte, DISTINCT, GROUP BY und UNION machen das Ergebnis schreibgeschützt. Binärspalten werden im Raster nicht bearbeitet. Und ist im Tab eine Transaktion offen (Autocommit aus) mit ausstehenden Anweisungen, bestätige oder verwirf sie vor dem Speichern: Das Speichern des Rasters würde sie mitnehmen.

Objekteigenschaften: F4 auf einer Tabelle im Schemabaum (oder Eigenschaften im Kontextmenü) öffnet ihren Tab direkt bei der Struktur; neben Daten gibt es vier Unter-Tabs: Spalten (Nr., Name, Typ, Nullbarkeit, Standardwert und ein Schlüsselsymbol an den Primärschlüsselspalten), Schlüssel (Primär-, Fremd-, Unique- und Check-Constraints; ein Doppelklick auf einen Fremdschlüssel öffnet die referenzierte Tabelle), Indizes und DDL — das CREATE TABLE des Objekts, bereit zum Kopieren, Speichern als .sql oder Öffnen in einem bearbeitbaren Tab. Wenn die Datenbank kein fertiges DDL liefert (PostgreSQL und SQL Server haben keinen solchen Befehl), rekonstruiert LightNote es aus den Metadaten — dasselbe gilt, wenn der DDL-Befehl mangels Berechtigung abgelehnt wird — und weist im Tab deutlich darauf hin. Wenn nicht einmal der Spaltenkatalog gelesen werden kann (keine Berechtigung oder Katalog nicht verfügbar), gibt es nichts zu rekonstruieren: Der Tab sagt das, statt still leer zu bleiben. Das Kontextmenü der Tabelle bietet auch DDL kopieren, ohne den Tab zu öffnen.

Objektbaum: im Bereich Verbindungen, unter der Liste, trennt der Baum der ausgewählten Verbindung Tabellen von Views (jede mit eigenem Symbol) und markiert die Spalten des Primärschlüssels mit einem Schlüsselsymbol. Der Baum zeigt außerdem Prozeduren und Funktionen, Trigger und Sequenzen (wo die Datenbank sie hat); ein Doppelklick auf eine Prozedur, Funktion oder einen Trigger öffnet den Quellcode in einer SQL-Konsole der Verbindung. Neben jeder Tabelle steht die ungefähre Zeilenzahl, im Tooltip ihr Kommentar — es ist die Schätzung, die die Datenbank speichert, kein COUNT(*). System-Schemas (SYS, pg_catalog…) sind ausgeblendet; der Eintrag am Ende der Liste zeigt sie an. Das Filterfeld siebt sofort das bereits Geladene und sucht ab 2 Buchstaben auch in der Datenbank: Was niemand aufgeklappt hat, erscheint oben im Ordner In der Datenbank. In einem Skript öffnet Ctrl+Alt+O (Zur Tabelle…, in der Verbindungsauswahl) die Suche per Tastatur, und F12 auf einem Tabellennamen öffnet deren Tab.

Metadaten aktualisieren. Nach einem in einem Skript ausgeführten CREATE, ALTER, DROP oder RENAME lesen der Baum, die Vervollständigung und die Tabelleneigenschaften Tabellen, Spalten und Typen wenige Sekunden später von selbst neu — ohne zu schließen, was im Baum geöffnet war. Bei ausgeschaltetem Autocommit wartet das Neulesen auf das Commit (oder das Rollback), denn vorher existiert die Änderung für die anderen Sitzungen noch nicht. Wurde die Struktur von außen geändert (ein anderes Programm, eine Migration), verwenden Sie die Schaltfläche Metadaten aktualisieren in der Skriptleiste, im Verbindungsmenü, neben dem Filter des Baums oder das Aktualisieren der Tabelleneigenschaften.

Das Schema erkunden: Rechtsklick auf eine Tabelle für SELECT in den Editor einfügen, Daten ansehen, Zeilen zählen, Qualifizierten Namen kopieren oder das Untermenü SQL generieren öffnen → INSERT/UPDATE/MERGE: ein Bildschirm listet die Spalten der Tabelle auf, sodass du Einschließen und Schlüssel markieren kannst, zeigt eine Live-Vorschau und legt den Befehl in den Editor ab (MERGE kommt in ANSI heraus; unterstützt der Treiber es nicht, erscheint eine Warnung). Direkt im Ergebnisraster baut die Schaltfläche SQL generieren in der unteren Leiste ein mit den Werten der ausgewählten Zeile vorausgefülltes INSERT/UPDATE/DELETE (verfügbar, wenn die Abfrage ein SELECT aus einer einzelnen Tabelle ist). Die Tabellen- und Spaltennamen, die du im Baum durchsuchst, tauchen auch in der Autovervollständigung (Strg+Leertaste) der .sql-Editoren der Verbindung auf, ohne zusätzliche Datenbankabfragen.

ER-Diagramm: Im Kontextmenü des Ordners Tabellen zeichnet ER-Diagramm der Tabellen alle; im Menü einer Tabelle zeichnet ER-Diagramm (diese Tabelle und die, auf die sie verweist) sie und die Tabellen, auf die ihre Fremdschlüssel zeigen. Das Ergebnis ist eine Notiz im Datenwörterbuch mit einem mermaid-Block erDiagram — Spalten mit Typ, PK/FK, und jeder Fremdschlüssel als Beziehung (optional, wenn die Spalte NULL erlaubt, eins zu eins, wenn der Schlüssel der Primärschlüssel selbst ist). Es ist Text in der Notiz: Er wird in Git versioniert und wie jedes Diagramm bearbeitet. Über 40 Tabellen bleiben die übrigen weg, und die Notiz sagt, wie viele.

Datei in eine Tabelle importieren: Datei in eine Tabelle importieren… (im Menü der Verbindung und im Ordner Tabellen) und Datei in diese Tabelle importieren… (im Menü einer Tabelle) bringen eine CSV-, TSV- oder Excel-Tabelle in die Datenbank — der Rückweg von Ergebnis exportieren. Das Fenster zeigt eine Vorschau mit dem für jede Spalte gelesenen Typ: Ein Typ gilt nur, wenn alle Zellen passen (Ganzzahl ohne führende Null — 01310 ist ein Code und bleibt Text —, Dezimalzahl mit Punkt oder Komma, ISO-Datum, wahr/falsch); ein Datum tt/mm/jjjj bleibt Text, weil der Monat zuerst stehen kann. Eine leere Zelle wird NULL. Das Trennzeichen wird wie in der Tabellenansicht erkannt. Tabelle erstellen verwendet den Dateinamen; An Tabelle anhängen prüft vorher, ob die Spalten der Datei dort existieren. Alles läuft in einer Transaktion: Schlägt eine Zeile fehl, bleibt nichts — und die bei diesem Import erstellte Tabelle wird gelöscht. Die Sperren gelten auch hier: Eine schreibgeschützte Verbindung lehnt ab, eine Produktionsverbindung fragt vorher. Bei einer DuckDB-Verbindung liest die Datenbank die CSV direkt, ohne Zeilengrenze; bei den anderen liegt die Grenze bei 100.000 Zeilen.

Export, Variablen und Transaktionen

Ergebnisse exportieren: Rechtsklicke auf das Ergebnisraster und wähle Ergebnis exportieren..., um CSV (Trennzeichen, Anführungszeichen-Zeichen, immer in Anführungszeichen, Kopfzeile, NULL-Text), JSON Lines oder SQL (INSERT-Anweisungen mit einem Tabellennamen) zu schreiben, mit einem optionalen Zeilenlimit. Der Export durchläuft die gesamte Abfrage im Streaming-Modus (seitenweises Erneut-Holen), nicht nur das, was auf dem Bildschirm sichtbar ist.

Ergebnis in der heutigen Notiz: Im Menü Exportieren des Rasters übernimmt Zur heutigen Notiz hinzufügen die Tabelle, wie sie auf dem Bildschirm steht — die sichtbaren Spalten in der Reihenfolge des Rasters, mit Suche und Filter — und direkt darunter die Abfrage in einem sql-Block: Die Notiz hält fest, woher die Zahl stammt. NULL erscheint als NULL, Zahlen sind rechtsbündig, und eine kursive Zeile sagt, wenn die Tabelle nicht das ganze Ergebnis ist (die ersten 200 Zeilen oder nur die schon geladenen).

Skriptvariablen: schreibe @set name = wert in eine Zeile des Skripts, um eine Variable zu definieren — das Präfix @ hält sie von der Datenbank fern (keine Kollision mit dem echten SET von Postgres/DuckDB/SQL Server). Verweise :name werden vor dem Ausführen ersetzt (außerhalb von Zeichenketten und Kommentaren; der Cast ::typ und Binds wie :1 bleiben unverändert); ein :name ohne Wert öffnet vor dem Ausführen eine Abfrage. Der Eintrag Variablen… im Menü von Ausführen öffnet die Liste der bereits definierten Variablen (bearbeiten/hinzufügen/entfernen).

Parameter: Wenn Sie eine Anweisung mit :name ausführen — oder mit ?, ?1, ?2, außer in PostgreSQL, wo ? ein JSON-Operator ist —, zeigt das Fenster Abfrageparameter die Anweisung und alle ihre Parameter, bereits mit dem zuletzt verwendeten Wert ausgefüllt, und die Liste jedes Parameters hält die früheren Werte bereit: mit einem anderen Wert wiederholen heißt, ein Feld zu ändern. Der Wert geht unverändert ins SQL, Text steht also in einfachen Anführungszeichen ('abc'). Was das Skript mit @set festlegt, wird nicht abgefragt. Deaktivieren Sie Bei jeder Ausführung fragen, damit der Tab die letzten Werte ohne Nachfrage verwendet; zum späteren Ändern dient Variablen….

Abfrageverlauf: der Eintrag Verlauf… im Menü von Ausführen öffnet ein Fenster mit den zuletzt erfolgreich ausgeführten Anweisungen dieser Verbindung, in den Spalten SQL / Wann / Dauer / Zeilen. Wähle eine, um sie Erneut auszuführen, In den Editor einzufügen oder zu Kopieren (Doppelklick fügt ein), oder nutze Verlauf löschen. Er wird nur auf dem lokalen Rechner gespeichert (weder in Git noch in der .lnc).

Verlauf aller Verbindungen: Aktivieren Sie im Verlaufsfenster Alle Verbindungen, um die Abfragen aller Datenbanken zu sehen, die neueste zuerst, mit der Spalte der Verbindung, und alle über das Filterfeld zu durchsuchen. Erneut ausführen gilt nur für die Abfragen dieser Verbindung; die einer anderen werden in den Editor eingefügt, damit Sie sie in der richtigen Datenbank ausführen.

Transaktionen: die Option Autocommit (standardmäßig an) liegt im Menü von Ausführen. Ist sie aus, bleiben Änderungen ausstehend, bis du sie bestätigst (Commit) oder verwirfst (Rollback), und die Leiste des Tabs zeigt Transaktion · N ausstehend mit beiden Befehlen. Den Tab zu schließen, die Verbindung zu wechseln oder zu trennen fragt bei offener Transaktion, was geschehen soll.

Inhalt

Bearbeiten

Werkzeuge

Automatisierung (KI / Skripte)

Referenz