Seite 1 von 2
QSqlTableModel: Wie leert man eine komplette Tabelle
Verfasst: 1. April 2011 22:41
von Ritchie
Hallo Zusammen,
weiss jemand, wie löscht man den kompletten Inhalt einer Tabelle via QSqlTableModel (Höhere Funktionen).
Für die Funktion removeRows( von, bis ) sind nur mit Integer Werten vorgesehen.
Was aber, wenn eine Datenbank-Tabelle mehr Daten als den Integer Bereich hat?
Gruss R.
Verfasst: 1. April 2011 23:05
von upsala
Falls man mit einem QSqlTableModel überhaupt soviele Zeilen verarbeiten kann, könnte man das Model so lange löschen, bis die Anzahl der Rows=0.
Verfasst: 2. April 2011 09:29
von padreigh
Merk dir das Tabllenlayout und nutze drop table ... als Query. Wozu willst du sowas? Oder nimm delete from tablename where 1; Aber wozu soll das gut sein?
Verfasst: 2. April 2011 15:38
von Ritchie
Hi,
nun ja, ich benötige diese Funktion für das mögliche Löschen von Log-Files.
In diesen Logfiles werden Aktionen des Programms aufgezeichnet.
Über einen längeren Zeitraum kann das schon eine Menge werden.
Hierfür denke ich mir eine Backup Funktion für die Daten zur Langzeitarchivierung,
welche auch wieder einsehbar sein soll und eine Löschfunktion für die aktuelle Tabelle.
Dropen wollte ich Sie eigentlich nicht. Eher so was wie "delete * from tabelle", nur halt generell.
Gruss R.
Verfasst: 2. April 2011 16:12
von franzf
Du loggst in eine Datenbank? Was ist der Hintergrund? Welche speziellen Features erhoffst du dir gegenüber einem Textfile? Welche DB verwendest du? Wenn SQLite: Backup == einfach aktuelles .sqlite-Datei an eine andere Stelle kopieren, neue .sqlite erstellen, fertig. Einen dicken db-Server (mysql, postgre, ...) fände ich NUR fürs loggen absolut mit Kanonen auf Spatzen... Um das Log durchzusehen, brauchst du Zugriff auf den Server, ein eigenes Programm zum Durchsuchen (auch wenns nur z.B. phpmyadmin ist), das fänd ich kontraintuitiv und -produktiv.
Verfasst: 2. April 2011 17:00
von padreigh
Ritchie hat geschrieben:Eher so was wie "delete * from tabelle", nur halt generell.
ich in anderem post hat geschrieben:DELETE FROM <tablename> WHERE 1;
Verfasst: 2. April 2011 23:46
von pfid
http://dev.mysql.com/doc/refman/5.1/de/truncate.html
Geht auch bei Oracle. Bei den anderen weiß ichs nicht.
Verfasst: 3. April 2011 00:13
von upsala
Postgres hat TRUNCATE.
SQLite hat es nicht.
MSSQL hat es.
Aber davon abgesehen hat TRUNCATE ein paar Nebenwirkungen, weswegen ich es nicht für den Normalbetrieb einsetzen würde.
Verfasst: 3. April 2011 14:11
von Ritchie
Hi,
die von mir verwendete Funktion, ist ein "User Log", für eine Art Electronic Signatur laut CFR21 Part 11, falls bekannt.
@franzf: Als Beispiel, werden hier Funktionen, wie "Tuer wurde durch Bediener geöffnet". Bediener X hat sich angemeldet/abgemeldet. Bediener hat Parameter X gespeichert." aufgezeichnet. Wird in der Pharma Industrie verwendet.
Ebenso werden Prozessmeldungen und Alarmmeldungen hierbei in einer MySQL Datenbank gesichert, welche von einer Steuerung eingeleitet werden. Diese Meldungen werden für eine Art "ProzessDokumentation" verwendet.
Kommerzielle Lösungen verwenden ähnliche Lösungen mit einer SQL Datenbank.
Verstehe in dann die "QSqlTableModel" Funktion so, das sie bei Datenmengen über "65565" (uint16) das Handtuch schmeißt.
Ich dachte eigentlich, das dieses Model generell nur die Daten lädt, welche im sichtbaren Bereich des Views sind. Der Rest wird dynamisch nachgeladen.
Was würde das Model also machen, wenn ich 2 Millionen Datensätze habe und durch diese Browse will (rein theoretisch). Ich weiss dass man hier besser einen Filter setzt. Es geht mir aber um die Leistungsgrenzen der Funktionen.
Gruss R.
Verfasst: 3. April 2011 14:37
von Christian81
max(signed int) = 2^31 - 1 != 65535...
Aber davon abgesehen ist ein eigenes model wohl zu bevorzugen. Zumal man dann bei solch großen Datenmengen selbst alles in der Hand hat.
Verfasst: 3. April 2011 14:51
von Ritchie
Würde das Standard-SQL Modell zuerst alle Daten laden und dann Anzeigen ?
Oder nur einen begrenzten Anzeigen Bereich ?
Gruss R.
Verfasst: 3. April 2011 15:01
von Christian81
Das steht nirgends. Also Sourcen studieren.
Verfasst: 3. April 2011 15:10
von Ritchie
Danke...
Verfasst: 4. April 2011 08:12
von pfid
upsala hat geschrieben:Postgres hat TRUNCATE.
SQLite hat es nicht.
MSSQL hat es.
Aber davon abgesehen hat TRUNCATE ein paar Nebenwirkungen, weswegen ich es nicht für den Normalbetrieb einsetzen würde.
Welche Nebenwirkungen? Und bei welcher DB?
Verfasst: 4. April 2011 09:11
von upsala
MySQL: Nicht transaktionssicher, AUTO_INCREMENT wird zurückgesetzt
Postgres: DELETE-Trigger wird nicht ausgelöst, blockiert Tasks die gerade auf die selbe Tabelle zugreifen, und wenn ein FOREIGN-KEY vorhanden ist bricht das Kommando ab.