Zeilen löschen und neue Spaltennamen setzten // Sqlite3 / Python?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Normalerweise sind Feldbezeichner und deren Domäne über die Lebenszeit einer Tabelle persistent. Gelegentliche Ausnahmen bestätigen die Regel.

Keinesfalls sollte eine Abhängigkeit der Feldbezeichner vom Inhalt eines spezifischen Tupels existieren.

Insofern solltest Du dahingehend vielleicht Deine Frage ergänzen oder präzisieren.

-----

Wie das eigentliche Löschen geht, weißt Du ja offenbar schon, denk daran auch ein commit auszuführen.

Das Löschen von Zeilen aus einer SQLite-Datenbank mit SQL ist eine relativ einfache Aufgabe, aber das Hinzufügen der gelöschten Daten zu den Spaltennamen ist ein wenig komplexer. Im Allgemeinen ist es jedoch keine gute Praxis, den Inhalt einer Zeile in den Spaltennamen zu speichern, da Spaltennamen dazu dienen sollten, die Daten in der Spalte zu beschreiben und nicht umgekehrt. Es gibt jedoch eine Möglichkeit, die Daten aus der gelöschten Zeile wiederherzustellen und sie in einer neuen Zeile zu speichern, anstatt sie den Spaltennamen zuzuweisen.

Hier ist ein Beispiel, wie Sie vorgehen könnten:

  1. Holen Sie die Daten aus der zu löschenden Zeile:
  2. cursor.execute("SELECT * FROM Ausgangsliste WHERE rowid = 1")
  3. deleted_data = cursor.fetchone()
  4. Löschen Sie die ersten 12 Zeilen aus der Tabelle:
  5. cursor.execute("DELETE FROM Ausgangsliste WHERE rowid <= 12")
  6. Fügen Sie eine neue Zeile in die Tabelle ein und füllen Sie sie mit den Daten aus der gelöschten Zeile:
  7. cursor.execute("INSERT INTO Ausgangsliste VALUES (?, ?, ?, ...)", deleted_data)

Dieses Beispiel setzt voraus, dass die Spaltenanzahl und die Spaltenreihenfolge in der Tabelle und der Abfrage übereinstimmen. Wenn Ihre Tabelle mehr oder weniger Spalten hat als die Abfrage, müssen Sie die Abfrage entsprechend anpassen.

Ich glaube, da liegt ein gewisses Verständnisproblem vor, oder vielleicht sogar mehrere.

Wie sorge ich jetzt aber dafür , dass der Inhalt der neuen ersten Zeile zu den Spaltennamen für die jeweilige Spalte wird?

Ich kann mir nicht vorstellen, dass du tatsächlich die Spaltennamen entsprechend dem Inhalt eines Datensatzes umbenennen möchtest. Falls doch, wäre das jedenfalls ziemlich unsinnig.

Da sind oben halt so Leerzeilen die ich eigentlich weghaben will. 

Wo sind Leerzeilen?

Ja, es fehlen dir jetzt die ersten 11 Rowids. Das stört aber nicht, da diese Datensätze bei einem SELECT ja nicht ausgegeben werden.

Solltest du tatsächlich ab 1 nummerierte Datensätze benötigen, würde ich für die Nummer eine eigene Spalte "nummer" anlegen und nach deiner Löschaktion ein

UPDATE Ausgangsliste SET nummer = nummer - 11

machen.

An sich kann man in gleicher Weise auch das rowid-Feld selbst updaten, da müsste man aber checken, ob er das in der richtigen Reihenfolge macht, sodass zu keinem Zeitpunkt die UNIQUE-Eigenschaft des Primärschlüssels verletzt wird.

UPDATE Ausgangsliste SET rowid = rowid - 11
Wie sorge ich jetzt aber dafür , dass der Inhalt der neuen ersten Zeile zu den Spaltennamen für die jeweilige Spalte wird?

??

Durch das Löschen von Datensätzen ändert sich doch die Struktur der Tabelle nicht.
Die "Spaltenbezeichnungen" (oder besser Feldbezeichnungen) bleiben doch erhalten.

Max1236 
Fragesteller
 05.03.2023, 06:58

Genau das ist ja genau mein Problem. Da sind oben halt so Leerzeilen die ich eigentlich weghaben will. Wenn du aber ja schon gesagt hast aktualisieren sich die

Spaltenbezeichnungen nicht.

0