ZEOS: Spalten umbenennen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

ZEOS: Spalten umbenennen

Beitrag von wp_xyz »

Wie kann man bei ZEOS eine Spalte einer existierenden Tabelle umbenennen? Das habe ich schon probiert:

Code: Alles auswählen

var
  sql: String;
begin
  sql := Format('ALTER TABLE %s RENAME COLUMN %s TO %s;', [ATableName, AOldFieldName, ANewFieldName]);
  FConnection.ExecuteDirect(sql);   

Auch "ALTER COLUMN" statt "RENAME COLUMN", mit und ohne "COLUMN", führen zur selben Fehlermeldung: "SQLError: SQL logic error or missing database". Oder kann man mit ZEOS Spalten gar nicht umbenennen? Falls es dennoch eine SQL-Anweisung gäbe, wäre diese universell für alle Arten von Datenbanksystemen anwendbar? Wenn ja, gibt es irgendwo eine Zusammenfassung des von ZEOS verwendeten SQL-Dialekts?

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

Re: ZEOS: Spalten umbenennen

Beitrag von Michl »

Welche Datenbank? Universell wird schwierig.

Z.B. SQLite bietet keine Möglichkeit eine Column umzubenennen. Dazu müsstest du die Tabelle umbenennen, eine neue mit den entsprechenden Bezeichnern erstellen, den Inhalt kopieren und die alte Tabelle löschen.
Siehe:http://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table

PostgreSQL hingegen kann Tabellenspalten umbenennen: https://www.postgresql.org/docs/9.5/static/sql-altertable.html

Code: Alles auswählen

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ZEOS: Spalten umbenennen

Beitrag von af0815 »

Man darf auch nicht vergessen, auf die Fremdschlüssel und andere Constrains. Universell ist nichts. Es hängt vom Datenbankserver UND der Datenbankstruktur ab. Beides kann eine Änderung verunmöglichen bzw. erschweren.

Was für ne DB hast du, sind die Felder (Fremd)schlüssel, hast du optimierungen durchgeführt (Index) ?

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: ZEOS: Spalten umbenennen

Beitrag von wp_xyz »

Sorry, ich hätte mehr schreiben sollen. Ich arbeite in dem Beispiel mit sqlite3, das ich über ZEOS anspreche. Die umzubenennenden Felder sind zum Glück einfache Felder, ohne Indices, Constraints usw. (kann sich aber irgendwann mal ändern...)

Hintergrund des Ganzen sind die TurboPower VisualPlanIt Komponenten, die ich gerade überarbeite (http://forum.lazarus.freepascal.org/ind ... 748.0.html), also Kalender-Elemente wie Tages-, Wochen- oder Monatsplaner, sowie Kontakt- und Aufgabenlisten. Die Daten sind in sogenanntem DataStores gespeichert, die in der Regel mit einer Datenbank verbunden sind. Das ganze ist recht allgemein angelegt, so dass man eigentlich jedes Datenbank-System verwenden kann, sofern man den entsprechenden Datastore hat bzw. schreibt. Auf ZEOS kam ich, weil ich der Meinung war (und eigentlich noch bin), dass ZEOS allgemeingültige SQL-Kommands zur Verfügung stellt, so das der Benutzer nur "seine" Datenbank in die ZConnection einstöpseln muss. Generell sind die Ansprüche an SQL gering, nur einfaches SELECT.

Bis auf das hier jetzt: Ich habe die Felder der verwendeten Tabellen ergänzt (http://forum.lazarus.freepascal.org/ind ... 936.0.html) bzw. umbenannt, und möchte nun eine Möglichkeit bieten, die alten Tabellen beim Start ins neue Format umzuwandeln.

Mit dem Einfügen leerer neuer Spalten hatte ich bisher keine Probleme, ein einfaches ALTER TABLE ... ADD COLUMN... war genug.

Zum Umbenennen der betreffenden bereits existierenden, mit Daten gefüllten (!) Spalten konnte ich bei dem Firebird-DataStore (Zugriff über SQLDB) ebenfalls ein einfaches ALTER TABLE ... RENAME COLUMN verwenden, so wie oben gezeigt. Bei dem Datastore für sqlite3 (Zugriff auch über SQLDB) musste ich das Umbenennen auf der Basis des von Michl zitierten StackOverflow-Beitrags angehen: also aktuelle Tabelle als Hilfstabelle umbenennen, neue aktuelle Tabelle erzeugen, Daten aus der Hilfstabelle in die neue Tabelle kopieren, dabei ggfs. den neuen Spaltennamen verwenden. Das geht nun genauso auch über ZEOS. Aber eigentlich wäre mein Wunsch gewesen, es gäbe für ZEOS sowas wie "ALTER TABLE...RENAME COLUMN..."

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ZEOS: Spalten umbenennen

Beitrag von af0815 »

SQLite kann NUR Tabellennamen ändern und Spalten hinzufügen, es kann also NIUR ein Subset der ALTER TABLE Kommandos anderer Systeme.

siehe auch https://www.sqlite.org/lang_altertable.html

Unter 'Making Other Kinds Of Table Schema Changes', steht wie man bei anderen Änderungen umgehen kann. Kurzum, neue Tabelle erzeugen alle Daten dort hin kopieren, alte Tabelle löschen, neue Tabelle umbenennen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: ZEOS: Spalten umbenennen

Beitrag von wp_xyz »

Das weiß ich. Ich rede aber von ZEOS. Und ich bekomme allmählich das Gefühl, dass ich von ZEOS eine falsche Vorstellung habe...

Ist der letzte Satz dieses Zitats (https://translate.google.com/translate? ... t=&act=url) richtig oder falsch?
The Zeos components allow access to different databases compilers Delphi, C ++ Builder and Lazarus. These non-visual components facilitate all operations related to databases of various types such as Oracle, Postgres, MySQL, Firebird, SQLite, etc. almost equally. In fact you can migrate an entire application from one database to another with just a few changes in the properties of the components.

Oder ist es so, wie ich jetzt befürchte, dass man nämlich die üblichen SQL-Abfragen (SELECT, INSERT, UPDATE) identisch formulieren kann, wenn man aber mehr in die Tiefe geht, treten die Unterschiede wieder zutage? Wie ist es zum Beispiel mit AutoInc-Feldern? Da gibt es massive Unterschiede zwischen den Systemen. Hat man über ZEOS hierzu eine einheitliche Schnittstelle? Wenn nicht, wäre mein Unterfangen, über ZEOS eine vielzahl verschiedener Datenbanksysteme für VisualPlanit verfügbar zu machen, wenig sinnvoll.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: ZEOS: Spalten umbenennen

Beitrag von MacWomble »

Nein, du verstehst das schon richtig. Dies kann aber natürlich nur für die Funktionen gelten, welche alle verwendeten Datenbanken unterstützen.
Zeos selbst ist ja 'nur' eine Zugriffskomponente und stellt keine neuen Funktionalitäten für die Datenbank bereit.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ZEOS: Spalten umbenennen

Beitrag von af0815 »

wp_xyz hat geschrieben: etc. almost equally.


Steht im Kleingedruckten. Was du da machen willst, sind massive Strukturänderungen, das sollte per Design nicht gemacht werden. Eine DB steht - Basta.

Für Dein Projekt möge es zwar in der Umstellungsphase die Notwendigkeit geben, im normalfall wird maximal was hinzugefügt. Man darf ja nicht vergessen, das der Programmierer und der SQL-DB Admin zwei verschiedene Typen sind, oft kommt dann noch der DB-Designer hinzu. Da geht nix mit mach ma mal. Das traut sich auch keiner bei einem großen System so wirklich :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten