Forum: PC-Programmierung sqlite3/Tcl: SELECT-Ergebnis als Liste von Listen


von Egon D. (Gast)


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.

von Jim M. (turboj)


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.

von Egon D. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.