2016-12-04 1 views
0

Python Version gelöscht: 2.7 OS: Ubuntu 12,04Die Größe der Datenbank bleiben gleich nach vielen Reihen

conn = sqlite3.connect("Database.db") 
cursor = conn.cursor() 
for id in ids: 
    cursor.execute("DELETE FROM tablename WHERE id = ?", (id,)) 
    conn.commit() 

löschen scheint zu funktionieren, aber die Größe von „database.db“ bleiben gleich. Was könnte das Problem sein?

Antwort

1

Das ist nicht überraschend. Datenbanken sind Sammlungen von Dateien (oder anderen Speichereinheiten). Diese Dateien speichern Daten auf einer so genannten Datenseite. Datenseiten enthalten Zeilen. Und Tabellen sind logische Konstrukte, deren Zeilen auf Datenseiten gespeichert sind.

Wenn Sie einen Datensatz aus einer Tabelle löschen, ändern Sie die Datenseiten, die diese Tabelle darstellen (vielleicht sogar einige entfernen). Sie ändern jedoch nicht die Datenbank, nur die Daten in der Tabelle.

+0

Was soll ich dann tun, um die Datenbankgröße zu reduzieren? Weil der Platz begrenzt ist und ich etwas Platz frei machen muss. –

+0

@ J. Joe. . . In SQLite glaube ich, dass Sie "Vakuum" verwenden: https://sqlite.org/lang_vacuum.html. –

-1

Die Größe von "Database.db" ist möglicherweise nicht gleich der Größe der Tabelle.

1

Gordon hat bereits erklärt, warum sich die Datenbankgröße auf der Festplatte nicht ändert. Im Fall von SQLite können Sie den Befehl VACUUM verwenden, um die Datenbank nach einer großen Anzahl von Löschvorgängen auf minimalen Speicherplatz neu zu erstellen.

Die offiziellen Dokumente sind normalerweise ziemlich trocken, wenn sie diese Dinge erklären. Weitere Informationen finden Sie unter here. Einige Auszüge:

SQLite ersten Kopien von Daten innerhalb einer Datenbank-Datei in eine temporäre Datenbank. Diese Operation defragmentiert die Datenbankobjekte, ignoriert die freien Speicherbereiche und repariert einzelne Seiten. Anschließend kopiert SQLite den Inhalt der temporären Datenbankdatei zurück in die ursprüngliche Datei der Datenbank. Die ursprüngliche Datenbankdatei wird überschrieben.

Der VACUUM-Befehl ändert nicht den Inhalt der Datenbank außer die Rowid-Werte. Wenn Sie die Spalte INTEGER PRIMARY KEY verwenden, ändert der VACUUM die Werte dieser Spalte nicht. Wenn Sie jedoch unaliased rowid verwenden, setzt der VACUUM-Befehl die Rowid-Werte zurück. Neben Ändern der Rowid-Werte baut der VACUUM-Befehl auch den Index von Grund auf neu.

Es empfiehlt sich, den VACUUM-Befehl in regelmäßigen Abständen, insbesondere beim Löschen der großen Tabelle oder des Index, auszuführen.

Es ist wichtig zu beachten, dass der Befehl VACCUM Speicher für erfordert die ursprüngliche Datei und auch die Kopie enthalten.

Verwandte Themen