[Gelöst] Prüfen ob es eine Datenbank schon gibt?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[Gelöst] Prüfen ob es eine Datenbank schon gibt?

Beitrag von pluto »

Hallo

In meiner SQL Anwendung würde ich gerne prüfen ob es eine Datenbank schon gibt oder eben nicht.

Sollte die Datenbank noch nicht geben, soll sie erstellt werden mit den Entsprechenden Tabellen:

Code: Alles auswählen

 
procedure TPLForumV1.CreateDB;
var
  str:string;
begin
  MariaDB.AConnection.DatabaseName:='';
  MariaDB.AConnection.Open;
  str:='CREATE DATABASE IF NOT EXISTS '+DBName;
 
  MariaDB.AConnection.ExecuteDirect(str);
  MariaDB.AConnection.ExecuteDirect('use ' + DBName); // Tipp von Socke in einem anderen Thread.
  MariaDB.AConnection.DatabaseName:=DBName;
 
  // Ist leider Wirkungslos. Da es die DB natürlich schon gibt, weil sie vorher schon erstellt wurde, wenn es sie noch nicht gab.
  str:='SHOW DATABASES LIKE '''+DBName+''';';
  MariaDB.Query.SQL.Text:=str;
  MariaDB.Query.ExecSQL;
  MariaDB.Query.Open;
 
  MariaDB.Query.SQL.Text:='grant all on '+DBName+'.* to plutodb@localhost;';
  MariaDB.Query.ExecSQL;
 
  MariaDB.ATransaction.Commit;
  MessageTable.CreateTable();
  PostTable.CreateTable();
end; // TPLForumV1.CreateDB
 

Dieser Code scheint ganz gut zu Funktionieren.
Das Problem ist halt dabei, dass ich nicht wirklich prüfen kann ob es die DB schon gibt, darum musste ich IF NOT EXISTS einsetzten, auch beim erstellen der Tabellen.

Somit ist natürlich " str:='SHOW DATABASES LIKE '''+DBName+''';';" wirkungslos.
Wie kann man das besser lösen?

Mein Ziel ist es:
Prüfen gibt es die Datenbank schon? Wenn ja, wähle sie aus. Mehr nicht. Wenn nicht, erstelle sie, wähle sie aus und erstelle die Tabellen. Derzeit sind es nur zwei, später kommen weitere Tabellen hinzu.
Zuletzt geändert von pluto am Fr 30. Jun 2017, 14:51, insgesamt 1-mal geändert.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Prüfen ob es eine Datenbank schon gibt?

Beitrag von Socke »

Du verbindest dich zuerst mit der System-Datenbank mysql.
Dort solltest du natürlich keine Tabellen anlegen, aber die Überprüfung auf Datenbanken, User etc. ist dort erlaubt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Prüfen ob es eine Datenbank schon gibt?

Beitrag von pluto »

Dort solltest du natürlich keine Tabellen anlegen, aber die Überprüfung auf Datenbanken, User etc. ist dort erlaubt.

Du meinst ich sollte einfach die Prüfung in "MariaDB.AConnection.ExecuteDirect" schreiben?
Aber wie bekomme ich das Ergebnis zurück?

Edit1:
Ich glaube ich weiß was du meinst, ich teste es mal.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Prüfen ob es eine Datenbank schon gibt?

Beitrag von pluto »

Ich habe es jetzt so: Er meint aber die Datenbank(mysql findet er, aber meine DB nicht) nicht zu finden, da es sie natürlich noch nicht gibt.:

Code: Alles auswählen

procedure TPLForumV1.CreateDB;
var
  str:string;
begin
  MariaDB.AConnection.DatabaseName:='mysql';
  MariaDB.AConnection.ExecuteDirect('use mysql');
  MariaDB.AConnection.Open;
 
  str:='SHOW DATABASES LIKE '''+DBName+''';';
  MariaDB.Query.SQL.Text:=str;
  MariaDB.Query.ExecSQL;
  MariaDB.Query.Open;
 
  writeln(MariaDB.Query.Fields.Count);
  if MariaDB.Query.Fields.Count = 0 then begin
    str:='CREATE DATABASE IF NOT EXISTS '+DBName;
 
    MariaDB.AConnection.ExecuteDirect(str);
 
    MariaDB.Query.SQL.Text:='grant all on '+DBName+'.* to plutodb@localhost;';
    MariaDB.Query.ExecSQL;
 
    MariaDB.ATransaction.Commit;
    MessageTable.CreateTable();
    PostTable.CreateTable();
  end;
 
  MariaDB.AConnection.ExecuteDirect('use ' + DBName);
  MariaDB.AConnection.DatabaseName:=DBName;
 
end; // TPLForumV1.CreateDB


Edit01: OK jetzt geht es: ich musste scheinbar nur MariaDB.Query.RecordCount verwenden in der IF Anweisung und nicht "MariaDB.Query.Fields.Count"
MFG
Michael Springwald

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: [Gelöst] Prüfen ob es eine Datenbank schon gibt?

Beitrag von marcov »

Ungetestet:

Code: Alles auswählen

 
  MariaDB.AConnection.Open;
  mariadb.gettablenames(astringlist);
  if astringlist.indexof(dbname)<>-1 then
   writeln('existiert');

Antworten