AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Automatiach erstellte Syntax

Automatiach erstellte Syntax

Ein Thema von Delbor · begonnen am 5. Sep 2017 · letzter Beitrag vom 9. Sep 2017
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.199 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Automatiach erstellte Syntax

  Alt 6. Sep 2017, 11:30
Hi zusammen
@TigerLily
Zitat:
PRAGMA foreign keys): Bei einem Import gibt es das Problem, dass uU Datensätze importiert, die eine Referenz auf einen Datensatz besitzen, der noch nicht importiert wurde. Wenn diese Referenz als foreign key abgebildet ist, gibt es einen Fehler. Wenn man aber weiß, dass alle Referenzen nach dem Import erfüllt sind, kann man diese foreign keys deaktivieren. Das kann man für einzelne foreign keys machen, einzelne Tabellen oder die ganze Datenbank (=PRGAMA foreign_key OFF). Und dreht es nach dem Import wieder auf.
Um mal 'alle Klarheiten zu beseitigen': die Datenbank, von der hier die Rede ist, ist leer, enthält also aktuell keine Daten. Diese werden von meinem Programm von Festplatte/direkt ab Scandisc in Form von Raw-Bildern eingelesen(Pathlist) und in einer bestimmten Reihenfolge in die DB geschrieben.**
Das heisst: von der zu erstellenden SQLite-DB müssen keine Daten aus MySQL übernommen werden, und deshalb ist das 'ATTACH' hier für mich erstmal nicht von Bedeutung - was aber nicht heisst, dass ATTACH grundsätzlich unwichtig für mich wäre, denn spätestens, wenns darum geht, Backups zu erstellen oder einzulesen, hat ATTACH sehr wohl Bedeutung. Dasselbe dürfte auch für die ForeignKeys gelten. Mein DB-Modell besteht gewissermassen aus 2 Zweigen, von MySQL Workbench "Layer" genannt.
Zentral ist dabei die Bildtabelle. Sie enthhält Spalten für das Rohbild, ein Thumbnail, eine Bitmap, ein Jpeg und eine FolderID.
Anschliessend wird ein Insert auf die Describetabelle gemacht und der PK der Bildtabelle als Fremdschlüssel eingefügt.
In diesem Layer gibt es noch eine Kategorientabelle, die mit der Desribetabelle über eine n:m-Beziehung verknüpft ist. Bevor überhhaupt mit einem Insert begonnen werden kann, muss diese Tabelle Daten enthalten, ansonsten bricht die Transaktion ab, da diese Tabelle den PK für den FK der Zwischentabelle liefert.
Es kann also keinen FK geben, der auf einen noch nicht vorhandenen PK verweist. Zumindest für diesen soeben beschriebenen ersten Zweig nicht.
Spannender wirds beim 2. Zweig. Dieser besteht zentral aus einer HTML-Tabelle, welche über eine Zwischentabelle mit der Bilddescribetabelle in einer n:M-Beziehung verbunden ist. Diese HTML-Tabelle wird vorerst nicht editiert; es gibt also hier keinen Insert und damit vorerst keinen mit der Bilddescribetabelle verbundenen Datensatz. Dieser wird erst zur Progammlaufzeit erstellt.

Sinn des Programmes ist es, zur Laufzeit eine (oder mehrere) HTML-Seiten zu erstellen und dieser dann per Drag&Drop bestimmte Bilder zuzuweisen. Das ist dann auch der Zeitpunkt, an dem die benötigten PK und FK erstellt und zugewiesen werden.

Zitat:
Wenn man aber weiß, dass alle Referenzen nach dem Import erfüllt sind,...
Das, fürchte ich, ist nur dann gefahrlos, wenn die Daten aus einer DB mit gleicher Struktur stammen, also eben etwa aus einem Backup.

**Die in meinem ersten Post gezeigte 'Satelliten"-DB soll pro Kategorie die RAW-Bilder und eine Bitmap dieser Rawdaten enthalten. Ziel ist es, diese Daten nicht in der "Mutter"-DB vorzuhalten, sondern extern auf beliebigen Laufwerken. Der Grund: die RAW-Bilder sind je nach Kamera zwischen 10 und 24 Megabyte gross, die entsprechenden Bitmaps in der Originalgrösse dreimal grösser.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.673 Beiträge
 
Delphi 12 Athens
 
#2

AW: Automatiach erstellte Syntax

  Alt 6. Sep 2017, 12:13
Es kann also keinen FK geben, der auf einen noch nicht vorhandenen PK verweist.
Dann versuch doch einmal, eine Tabelle mit einem FK anzulegen, wenn es die darin referenzierte Tabelle noch gar nicht gibt, weil sie in der Erstellungsreihenfolge erst später kommt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.199 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Automatiach erstellte Syntax

  Alt 6. Sep 2017, 13:47
Hi DeddyH
Zitat:
Dann versuch doch einmal, eine Tabelle mit einem FK anzulegen, wenn es die darin referenzierte Tabelle noch gar nicht gibt, weil sie in der Erstellungsreihenfolge erst später kommt.
Sorry, wieso sollte ich dies tun? Ich habe TigerLilys Aussage ja gar nicht angezweifelt:
Zitat:
PRAGMA foreign keys): Bei einem Import gibt es das Problem, dass uU Datensätze importiert, die eine Referenz auf einen Datensatz besitzen, der noch nicht importiert wurde. Wenn diese Referenz als foreign key abgebildet ist, gibt es einen Fehler. Wenn man aber weiß, dass alle Referenzen nach dem Import erfüllt sind, kann man diese foreign keys deaktivieren. Das kann man für einzelne foreign keys machen, einzelne Tabellen oder die ganze Datenbank (=PRGAMA foreign_key OFF). Und dreht es nach dem Import wieder auf.
Ausserdem bestätigt meine Aussage diejenige von TigerLili(oder umgekehrt), ob das nun in MySQL oder sonstwo ist:
Zitat:
In diesem Layer gibt es noch eine Kategorientabelle, die mit der Desribetabelle über eine n:m-Beziehung verknüpft ist. Bevor überhhaupt mit einem Insert begonnen werden kann, muss diese Tabelle Daten enthalten, ansonsten bricht die Transaktion ab, da diese Tabelle den PK für den FK der Zwischentabelle liefert.
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.673 Beiträge
 
Delphi 12 Athens
 
#4

AW: Automatiach erstellte Syntax

  Alt 6. Sep 2017, 13:53
Wir reden doch hier von DDL (Data Definition Language) und nicht von DML (Data Manipulation Language), oder täusche ich mich? Das bedeutet, dass alle Tabellen erst einmal erstellt werden, bevor die erste davon befüllt wird. Das bedeutet aber auch, dass man, wenn man die Fremdschlüssel sofort definiert, die Erstellungsreihenfolge der Tabellen beachten muss, da das sonst in die Hose geht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.199 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Automatiach erstellte Syntax

  Alt 6. Sep 2017, 15:34
Hi DeddyH
Ja, wir reden erstmal von DDL:
Zitat:
Das bedeutet, dass alle Tabellen erst einmal erstellt werden, bevor die erste davon befüllt wird. Das bedeutet aber auch, dass man, wenn man die Fremdschlüssel sofort definiert, die Erstellungsreihenfolge der Tabellen beachten muss, da das sonst in die Hose geht.
In meinem Fall hat MySQL Workbench die Tabelle erstellt, nachdem ich in Workbench ein Forward-Engineering durchgeführt habe. Dabei wurden die FK-Spalten schon im Workbench-Modell definiert, nicht aber deren Werte - die ergeben sich erst beim Insert der Daten aufgrund des PK-Wertes in der vorgängig mit Daten gefüllten Tabelle.
Das DB-Modell entstand seinerzeit mit im wesentlichen deiner und ccLouds Hilfe im Delphi-Treff. Leider hab ich die Beiträge nicht mehr gefunden.
Seinerzeit haben wir, auch mit Rc2c, viel über Normalisierung und u.a. auch Dateninkonsistenz diskutiert.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.199 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 11:35
Hi zusammen
Soeben hab ich mal versucht, die Datenbank zu erstellen. Als erstes hab ich mal das von MySQL-Workbench erstellten SQLite-CreateScript in Funktionen pro erstellter Tabelle aufgeteilt. Nachfolgend die Prozedure, die die DB erstellen sollte:
Delphi-Quellcode:
procedure TDMLSQLite.ContentmasterDBCreate;
  var SQLString: String;
begin
  try
    DMLSQLite.FDSQLiteConnection.Connected := false;
    DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite';// Geänderte Zeile(M statt m)
    DMLSQLite.FDSQLiteConnection.Params.Values['FailIfMissing']:='False';
    DMLSQLite.FDSQLiteConnection.Params.Values['PRAGMA foreign_keys']:='ON';
    DMLSQLite.FDSQLiteConnection.Connected := true;
    SQLString := '';
    SQLString := Createbilddescribetabelle;
    SQLString := SQLString + Createbilddescribetabelle_has_HtmlTabell;
    SQLString := SQLString + Createbildtabelle;
    SQLString := SQLString + CreateCSSTabelle;
    SQLString := SQLString + Creategalerietabelle;
    SQLString := SQLString + CreateHTMLTable;
    SQLString := SQLString + CreateJavascriptTable;
    SQLString := SQLString + Createkategorien_tabelle;
    SQLString := SQLString + Createkategorien_tabelle_has_bildDescribeTabelle;
    SQLString := SQLString + CreateMenueTabelle;
    SQLString := SQLString + CreateSubMenue2Table;
    SQLString := SQLString + CreateSubmenuetabelle;
    DMLSQLite.FDSQLiteConnection.ExecSQL(SQLString);
  except
    on E: EDatabaseError do
     ShowMessage('Exception raised with message' + E.Message);
  end;
end;
Und das ist die Fehlermeldung, die mir Delphi anzeigt:

Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unknown database "ContentMasterData"' aufgetreten.
---------------------------
Darauf hab ich folgende Zeile geändert:
DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite';
in

DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentMasterData\ContentMasterData.sqlite';
In allen Funktionen, die dem SQLString zugewiesen werden, ist das Teilwort 'Master' gross geschrieben, also müsste dies auch im DB-Namen der von SQLite erzeugten DB der Fall sein. Trotzdem ändert sich die Fehlermeldung nicht...
Zitat:
---------------------------
Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse ESQLiteNativeException mit der Meldung '[FireDAC][Phys][SQLite] ERROR: unknown database "ContentMasterData"' aufgetreten.
---------------------------
Im Anhang zeigt ein Jpeg die Situation im besagten Verzeichnis. Auf Doppelklick auf den da gezeigten Ordner öffnet sich sqlite-Expert und zeigt mir eben diesen Ordner an. - mit einigen DB-spezifischen Metadaten, aber ohne die Tabellen.
Was habe ich falsch gemacht?

Gruss
Delbor
Angehängte Grafiken
Dateityp: jpg Pfad mit Unterordner.JPG (23,7 KB, 7x aufgerufen)
Dateityp: jpg Anzeige SQLiteExpert2.JPG (78,4 KB, 6x aufgerufen)
Dateityp: jpg Anzeige SQLiteExpert.JPG (66,6 KB, 7x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 7. Sep 2017 um 11:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.258 Beiträge
 
Delphi 12 Athens
 
#7

AW: Automatiach erstellte Syntax

  Alt 7. Sep 2017, 11:44
Sollte das statt

DMLSQLite.FDSQLiteConnection.Params.Values['Database']:='M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite'

nicht besser heißen:

DMLSQLite.FDSQLiteConnection.Params.Add('Database= M:\SQLite-DB Corner\ContentmasterData\ContentmasterData.sqlite' );
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz