AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SQLite: ALTER TABLE if not exists

Ein Thema von Kratons · begonnen am 3. Nov 2014 · letzter Beitrag vom 11. Nov 2014
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: SQLite: ALTER TABLE if not exists

  Alt 3. Nov 2014, 19: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 19:24 Uhr)
  Mit Zitat antworten Zitat
Kratons

Registriert seit: 20. Okt 2014
Ort: Deutschland
12 Beiträge
 
FreePascal / Lazarus
 
#2

AW: SQLite: ALTER TABLE if not exists

  Alt 3. Nov 2014, 20:06
Hi, danke nochmals sir Rufo,

hier meine Lösung: (hatte deinen letzten post noch nicht gelesen..)

Code:
  dbC.Open; //Datenbank Erstellen falls nicht vorhanden.
  // erstelle Tabelle **User** falls nicht vorhanden
  dbQ.SQL.Text:='CREATE TABLE if not exists ''user'' (id varchar(36) primary key, name varchar(20) unique, pw varchar(100), rights Integer)';
  dbQ.ExecSQL; dbT.Commit;
  dbQ.Close;
  //erstelle spalte name falls nicht vorhanden
  dbQ.SQL.Text:='PRAGMA table_info (''user'')';
  dbQ.Open;
  if not dbQ.Locate('name','name',[]) then
  begin
    dbQ.SQL.Text:='ALTER TABLE user ADD COLUMN name varchar(20)';
    dbQ.ExecSQL; dbT.Commit;
    dbQ.SQL .Text:='CREATE unique INDEX iusername ON user (name)';
    dbQ.ExecSQL; dbT.Commit;
  end;
  dbQ.Close;
  //erstelle spalte pw falls nicht vorhanden
  dbQ.SQL.Text:='PRAGMA table_info (''user'')';
  dbQ.Open;
  if not dbQ.Locate('name','pw',[]) then
  begin
    dbQ.SQL.Text:='ALTER TABLE user ADD COLUMN pw varchar(100)';
    dbQ.ExecSQL; dbT.Commit;
  end;
  dbQ.Close;
  //erstelle spalte rights falls nicht vorhanden
  dbQ.SQL.Text:='PRAGMA table_info (''user'')';
  dbQ.Open;
  if not dbQ.Locate('name','rights',[]) then
  begin
    dbQ.SQL.Text:='ALTER TABLE user ADD COLUMN rights Integer';
    dbQ.ExecSQL; dbT.Commit;
  end;
  dbQ.Close;
Hoffe das hilft jenem der das selbe Problem hat.
Dieser Code produziert exakt die Tabellen die ich brauch, bzw. sorgt dafür das nei ein der spalten fehlt.

Trotzdem vieleb dan kan sir Rufo für seine hilfe.

Die Antwort: 42

Geändert von Kratons ( 3. Nov 2014 um 21:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.814 Beiträge
 
Delphi 12 Athens
 
#3

AW: SQLite: ALTER TABLE if not exists

  Alt 4. Nov 2014, 08:49
Was passiert denn schlimmes, wenn die Tabelle/Spalte bereits existiert?

Oracle gibt einen Fehler aus und macht weiter, ist das bei SQLite etwa anders?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: SQLite: ALTER TABLE if not exists

  Alt 4. Nov 2014, 09:09
Schau dir mal in der Hilfe das Stichwort "Data.DB.TDataSet.GetFieldNames" an, vielleicht hilft dir das weiter.

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Kratons

Registriert seit: 20. Okt 2014
Ort: Deutschland
12 Beiträge
 
FreePascal / Lazarus
 
#5

AW: SQLite: ALTER TABLE if not exists

  Alt 11. Nov 2014, 20:59
Was passiert denn schlimmes, wenn die Tabelle/Spalte bereits existiert?

Oracle gibt einen Fehler aus und macht weiter, ist das bei SQLite etwa anders?

Sherlock
SQlite gibt ne Fehlermeldung aus und hat dann 2 knöpfe "Abort" und "continue"(at own risk of data coruption)

ich wollte halt verhindern das der Kunde hinterher bei jedem Programmstart erstmal 545618418768761264 mal continue drücken muss ...


Schau dir mal in der Hilfe das Stichwort "Data.DB.TDataSet.GetFieldNames" an, vielleicht hilft dir das weiter.

Grüße
Mikhal
Vielen dank, für den vorschlag,
werde es mir anguckenwenn ich zeit hab...
(habe jetzt ja schon ne brauchbare lösung)

Die Antwort: 42
  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 02:34 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