sqlite3/Tcl: SELECT-Ergebnis als Liste von Listen

Gast #6722339
Lesenswert?
• ▲
▼
Hallo allerseits,

wahrscheinlich bin ich nur zu dumm, die Dokumentation
zu verstehen; ich gehe gerade die allerersten Schritte
mit sqlite.

Sachlage:
In einem Tcl-Script verwende ich eine in-Memory-sqlite-
Datenbank. Dort gibt es z.B. eine Tabelle "segments",
die die Spalten "symname", "pid1" und "pid2" enthält.

Diese Tabelle enthält zu jedem Liniensegment den Namen
das Symbols, zu dem dieses Liniensegment gehört (symname)
sowie den Index (die Nummer) des Anfangspunktes (pid1)
und des Endpunktes (pid2). Das klappt soweit.

Jetzt kann ich mittels
1
 
2
symdb eval { SELECT pid1, pid2 FROM segment WHERE symname ="resistor" }
alle Anfangs- und Endpunkte aller Segmente abfragen, die
zum Symbol "resistor" gehören. Auch das funktioniert; die
zurückgelieferten Nummern sind vollständig und korrekt.

Die Sache hat nur den Schönheitsfehler, dass die Ergebnismenge
einfach als langer, unstrukturierter Bandwurm geliefert wird:
"0 2 1 3 3 7 7 5 5 1 6 8"

Ich hätte aber gern: "{{0 2} {1 3} {3 7} {7 5} {5 1} {6 8}}",
denn die Datenbanktabelle weiss ja, dass zu jedem Segment
(=jeder Zeile in der Tabelle) ZWEI Punkte gehören, ein
Anfangs- und ein Endpunkt, und dass insgesamt sechs Segmente
zur Ergebnismenge gehören.

Kann man diese Struktur irgendwie direkt aus dem "eval"-
Kommando von sqlite herausholen?

Ich habe bereits herausgefunden, dass man der Abfrage
ein assoziatives Array und ein Script mitgeben kann,
das bei jeder Ergebniszeile einmal ausgeführt wird, aber
ich sehe nicht, wie mir das helfen soll. Ich will die
Ergebnismenge ja nicht in einem Array haben -- das ist
ja noch umständlicher als ein langer Bandwurm!

Nachträglich mit Tcl-Mitteln umformatieren geht natürlich,
aber das finde ich nicht schön. Mich stört, dass ich die
Struktur der Daten dann praktisch zweimal hinschreiben
muss -- einmal im SELECT und einmal in der nachfolgenden
Umformatierung. Das führt zu Irrtümern.

Wahrscheinlich habe ich da nur einen Verständnisfehler.


Ich hoffe, meine Frage ist verständlich beschrieben. Ich
danke im Voraus für jeden ernsthaften Versuch der Hilfe.
#6722619
Lesenswert?
• ▲
▼
Egon D. schrieb:
> Ich habe bereits herausgefunden, dass man der Abfrage
> ein assoziatives Array und ein Script mitgeben kann,
> das bei jeder Ergebniszeile einmal ausgeführt wird,

Genau das ist die Lösung, wenn man Tcl matrix benutzt. Man fängt mit 
einer leeren Matrix an, und fügt jeweils eine neue Zeile an für jede 
Ergebnis Zeile in der SQL Abfrage.

Die fertige Matrix sollte dann genau wie Dein gewünschtes Ergebnis 
aussehen.
Gast #6722802
Lesenswert?
• ▲
▼
Jim M. schrieb:

> Egon D. schrieb:
>> Ich habe bereits herausgefunden, dass man der Abfrage
>> ein assoziatives Array und ein Script mitgeben kann,
>> das bei jeder Ergebniszeile einmal ausgeführt wird,
>
> Genau das ist die Lösung, wenn man Tcl matrix benutzt.
> Man fängt mit einer leeren Matrix an, und fügt jeweils
> eine neue Zeile an für jede Ergebnis Zeile in der
> SQL Abfrage.

Okay... also Du willst mir sagen, dass es NUR dadurch,
dass man der SQL-Abfrage eine magische Option mitgibt,
tatsächlich nicht geht -- man muss eigenen Tcl-Code
schreiben, der das leistet (auch wenn es nur eine
einzige Zeile ist).

Okay. Kann ich mit leben. Wollte nur sichergehen.


> Die fertige Matrix sollte dann genau wie Dein
> gewünschtes Ergebnis aussehen.

Kam vielleicht nicht deutlich genug rüber: Mit der
Liste funktioniert es ja prinzipiell -- ich finde
das nur nicht sonderlich elegant und kompakt. Erstens
muss ich die Spalten zweimal hinschreiben -- einmal
in der Abfrage, und einmal für's Zusammenbauen der
Ergebnisliste --, und zweitens bekomme ich das Ergebnis
nicht als Rückgabewert, sondern als Seiteneffekt. Aber
das ist alles kein Drama.

Danke für die Auskunft.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.