SQLITE3 und DDL Ermitteln die 2te

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

SQLITE3 und DDL Ermitteln die 2te

Beitrag von Lorca »

Hallo zusammen,

irgendwie stehe ich mir selber im Wege :(
Als Socke mir am 03.12.20 den Tip zum auslesen der Schema Tabelle gegeben hat habe ich es sofort ausprobiert und es hat gefunzt.
Nun benötige ich diese Schema Informationen und bekomme es zum Verrecken nicht mehr hin. Das Test Coding von damals habe ich auch nicht mehr.

Wenn ich die Tabelle Album mit SELECT * FROM Album auslese, sind die Tabellendaten da und in der DBGrid sichtbar. Somit habe ich die SQLITE3 Einstellungen in ZConnection, ZQUERY1 und Datasource korrekt verbunden.

Will ich jedoch das Schema auslesen mit SELECT sql FROM "sqlite_schema" WHERE "type" = "table" AND "name" = "Album"
bekomme ich immer einen SQL Logic Error. Irgendetwas muss ich wohl an dem SELECT Befehl falsch gemacht haben.
Oder liegt es vllt an etwas anderem?

Sobald ich den SQL Befehl mit ZQuery1.Active := True absetze, knallt mir die Fehlermeldung um die Ohren.
Ich habe auch schon alle möglichen Konstellationen ausprobiert. Immer wieder diese Fehlermeldung.

Muss ich diesen befehlt vllt. erst nach dem "normalen" Einlesen der Tabelle mit ZQUERY1.ExecSQL absetzen?

Eigentlich benötige ich nur die Fremdschlüssel Definitionen einer Tabelle.
Also welches Feld ist mit welcher Tabelle über welchen Referenz schlüssel verbunden. Leider bietet das Pragma Table_Info(Tabname) diese Information nicht.


herzlichen Dank im Voraus

Lorca

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von Michl »

Evtl. so?: SELECT sql FROM "sqlite_schema" WHERE "type" = "table" AND "tbl_name" = "Album"

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von charlytango »

Lorca hat geschrieben:
Sa 5. Jun 2021, 10:23
Ich habe auch schon alle möglichen Konstellationen ausprobiert. Immer wieder diese Fehlermeldung.
Bin jetzt kein SQlite-Guru, aber immer wenn SQL-Statements komplexer werden oder wenn sie mal nicht klappen oder ich mir eine Fehlermeldung einfange, teste ich die Statements außerhalb und unabhängig von Lazarus direkt gegen die Datenbank.

Mit welchem Werkzeug ist dann eher Geschmackssache. Die Hardcore-Fraktion benutzt da sicher ein Commandline-Tool, aber nachdem HeidiSQL (halt nur auf WIN) nun auch mit SQLite umgehen kann, reicht das für mich vollauf.

Damit stelle ich sicher dass mir meine eigene "Firmenblindheit" nicht in die Suppe spuckt.
Erst wenn die Statements sauber laufen, baue ich sie in Lazarus ein.

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von Lorca »

Hallo zusammen,

zunächst ganz herzlichen Dank für eure Antworten :)
@Michl: Leider kann m.w. Dein Vorschlag nicht funktionieren, da die Felder: TYPE und NAME zur Tabellen Struktur Felder der Tabelle sqlite_schema gehören. Von einem Feld namens "tbl_name" habe ich keine Information.
Außerdem hat dieser Befehl im Dezember 2020 funktioniert. Das Coding dazu habe ich jedoch nicht mehr.
Und nun weiß ich nicht was ich da falsch mache. Falsche Hochkommata? Falscher Zeitpunkt des Abrufes? ...
Ich probiere alles aus und komme zu keinem Ergebnis.

@charlytango: Ich arbeite unter Windows 7 (64) mit SQLITE Studio. Im zugehörigen SQL Editor habe ich auch schon diesen Befehl eingegeben. Leider kennt SQLITE Studio die SQL-interne Tabelle sqlite_schema nicht. (Meldung: no such Table)
Da ich gerade erst mit Lazarus, ZEOS und SQLITE3 anfange habe ich auch keine Erfahrungen mit Kommando Zeilen Versionen für SQLITE oder andere SQL Datenbanken. Ich muss mich halt in allem mühsam einarbeiten. *heul* :)

Der Befehl den damals der Kollege socke vorgeschlagen hat, hat ja funktioniert. Ich habe auch kein UPDATE von SQLITE gefahren.
Wenn ich das richtig herausgefunden habe. muss ich erst einen allgemein gültigen SELECT Befehl in ZQUERY1.SQLText eingeben (z.B Select * frim album ) und die QUERY mittels Active := True öffnen. Danach war es meiner Erinnerung nach möglich mit ZQUERY1.SQL.TEXT := SELECT sql FROM "sqlite_schema" WHERE "type" = "table" AND "name" = "Album" und anschließendem ZQUERY1.ExecSQL die gewünschten DDL Informationen ermitteln zu lassen. Nur jetzt funzt das nicht mehr, (So'n Ärger ). Ist das Vllt.ein Reihenfolge Problem? Ich habe keine Ahnung


Viele Grüße
Lorca

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von charlytango »

Lorca hat geschrieben:
So 6. Jun 2021, 12:21
Leider kennt SQLITE Studio die SQL-interne Tabelle sqlite_schema nicht. (Meldung: no such Table)
möglcherweise heisst die Tabelle auch anders ?

https://www.sqlite.org/schematab.html
https://www.sqlite.org/fileformat2.html#ffschema

und hier auch noch:
https://www.sqlitetutorial.net/sqlite-t ... ibe-table/

versuch doch einfach als SQL-Statement:

Code: Alles auswählen

pragma table_info('albums');
wenn du zb die Felder der Tabelle albums auflisten möchtest.

Hilfreiche pragma statements findest du zb hier:

Code: Alles auswählen

https://sqlite.org/pragma.html
sqlite_master als name wird akzeptiert
Zuletzt geändert von charlytango am So 6. Jun 2021, 14:05, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von Michl »

Hatte es getestet. Hier geht es, so wie ich es oben schrieb. Anbei ein Minimalbsp. für Lazarus Trunk und Zeos Trunk (wird nicht unter Lazarus 2.0.x laufen, da sich das LFM Format verändert hat).

Ansonsten siehe https://www.sqlite.org/schematab.html

Ich verwende hier einfache Hochkommas, der Test mit den Gänsefüßchen und deinem SQL-Statement lief hier aber auch.
Dateianhänge
ZEOS_SQLite_Einfach.zip
(2.9 KiB) 85-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: SQLITE3 und DDL Ermitteln die 2te

Beitrag von Lorca »

Hallo

an alle die Ihr so nett gewesen seid, und mir geantwortet habt.
Ich habe keine Ahnung was bei mir falsch gelaufen war.
Nun funktioniert es wieder. Dank an euch.


Viele Grüße
Lorca

Antworten