Nachdem ich viele der Fragen über die DB-Schemamigration und -versionen durchgelesen habe, habe ich ein Schema entwickelt, um das DB-Schema während unseres Aktualisierungsprozesses sicher zu aktualisieren. Die Grundidee besteht darin, dass wir während einer Aktualisierung die Datenbank in eine Datei exportieren, alle Tabellen löschen und neu erstellen und dann alles erneut importieren. Nichts zu ausgefallen oder riskant.
Das Problem ist, dass dieses System etwas "viral" ist, was bedeutet, dass es nur sicher ist, Spalten oder Tabellen hinzuzufügen, da das Entfernen von ihnen Probleme beim erneuten Importieren der Daten verursachen würde. Normalerweise wäre es in Ordnung, diese Spalten zu ignorieren, aber das Problem ist, dass viele der entfernten Elemente tatsächlich refaktoriert wurden und das Vorhandensein der alten im Code andere Programmierer dazu bringt zu denken, dass sie sie verwenden können.
>Ich möchte also einen Weg finden, um Spalten oder Tabellen als veraltet markieren zu können. Im Idealfall würden die veralteten Objekte während der Aktualisierung des Schemas markiert werden, aber dann würde unser Backup-Skript bei der nächsten Aktualisierung die Objekte, die auf diese Weise markiert wurden, nicht einfach AUSWÄHLEN, sodass wir diese Teile des Schemas schließlich auslaufen lassen können .
Ich habe festgestellt, dass MySQL (und wahrscheinlich auch andere DB-Plattformen, die wir verwenden) das COLUMN-Attribut für Felder und Tabellen unterstützt. Das wäre perfekt, außer dass ich nicht herausfinden kann, wie ich es sinnvoll einsetzen kann. Wie würde ich eine SQL-Abfrage schreiben, um alle Spaltennamen zu erhalten, die nicht einen Kommentar enthalten, der zu einem Text passt, der das Wort "deprecated" enthält? Oder sehe ich dieses Problem falsch an und vermisse einen viel besseren Weg, dies zu tun?
" Veraltet " bedeutet normalerweise (zumindest für mich), dass etwas für die Entfernung zu einem späteren Zeitpunkt markiert werden soll, sollte nicht von neuen Funktionen verwendet und wird im vorhandenen Code entfernt / geändert.
Ich kenne keine gute Möglichkeit, eine veraltete Spalte zu "markieren", außer sie umzubenennen, was wahrscheinlich Dinge kaputt macht! Selbst wenn eine solche Einrichtung existierte, wie viel würde es wirklich sein?
Möchten Sie wirklich ablehnen oder entfernen? Aus dem Inhalt Ihrer Frage rate ich Letzteres.
Ich habe das unangenehme Gefühl, dass Sie in einer dieser Situationen sein könnten, "wenn ich dahin wollte, dass ich nicht von hier aus anfangen würde". Hier sind jedoch einige Ideen, die Ihnen in den Sinn kommen:
Lesen Sie die Rezepte für die fortlaufende Datenbankintegration , die einen Großteil Ihres Problembereichs anzugehen scheint
Löschen Sie die Spalte explizit. In MySQL 5.0 (und sogar früher?) Existiert die Einrichtung als Teil von DDL: siehe ALTER TABELLE Syntax.
Sehen Sie sich an, wie ActiveRecord :: Migration in Ruby funktioniert. Eine Migration kann die Anweisung "remove_column" enthalten, die das Problem auf plattformgerechte Weise behandelt. Es funktioniert definitiv mit MySQL, aus eigener Erfahrung.
Führen Sie ein Skript für Ihren Export aus, um die Spalte aus den INSERT-Anweisungen zu entfernen, und zwar sowohl für Spalten- als auch für Wertelisten. Wahrscheinlich ziemlich brauchbar, wenn Ihre DB ziemlich klein ist, was ich vermute, dass es sein muss, wenn Sie es wie beschrieben exportieren und erneut importieren.