Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: SQLite: ALTER TABLE if not exists

  Alt 3. Nov 2014, 20:16
Generell würde ich da aber auch nicht zu viel Aufwand betreiben. In der Regel reicht es eigentlich aus entsprechende Upgrade-Skripte vorzuhalten, die man dann auf die Datenbank anwendet.
SQL-Code:
--
-- Upgrade from Version 0 (empty database)
--
PRAGMA foreign_keys = false;
PRAGMA ignore_check_constraints = false;

CREATE TABLE "user" (
  "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
);

PRAGMA ignore_check_constraints = true;
PRAGMA foreign_keys = true;

-- set new version
PRAGMA user_version = 1;
SQL-Code:
--
-- Upgrade from Version 1 (empty database)
--
PRAGMA foreign_keys = false;
PRAGMA ignore_check_constraints = false;

ALTER TABLE "user" ADD COLUMN "username" VARCHAR(30);
ALTER TABLE "user" ADD COLUMN "password" VARCHAR(30);

PRAGMA ignore_check_constraints = true;
PRAGMA foreign_keys = true;
-- set new version
PRAGMA user_version = 2;
Über das Statement PRAGMA user_version bekommt man den Wert (Integer) von der Datenbank und sich dann einfach das passende Upgrade-Skript heraus.

Dabei muss man dann aber nicht ständig alle Skripts irgendwie anpassen, sondern kann die Versionen auch einfach "durchlaufen", das spart jede Menge Arbeit und ist auch einfacher in der Handhabung.
Delphi-Quellcode:
procedure UpgradeDatabase( ToVersion : Integer; const ScriptDir : string );
var
  LLast,
  LCurrentVersion : Integer;
  LScript : string;
begin
  LLast := -1;
  repeat
    // "PRAGMA user_version" ausführen und den Wert lesen
    LCurrentVersion := GetDatabaseVersion;
    // Endlosschleife erkennen
    if LLast = LCurrent then
      raise Exception.CreateFmt( 'Upgrade-Script v%d -> v%d is missing!', [LCurrentVersion, ToVersion] );
    if LCurrentVersion <> ToVersion then
    begin
      // Upgrade-Skript laden
      LScript := LoadUpgradeScript( LCurrentVersion );
      // Upgrade-Skript ausführen (in einer Transaktion, soll Exception bei Skriptfehler werfen)
      DatabaseExecuteScript( LScript );
    end;
    LLast := LCurrentVersion;
  // solange bis die Ziel-Version erreicht wurde
  until LCurrentVersion = ToVersion;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 3. Nov 2014 um 20:24 Uhr)
  Mit Zitat antworten Zitat