Seite 1 von 2
dbfpy(dBase)-wie lösche ich Inhalte einer Tabelle?
Verfasst: Mittwoch 17. Dezember 2008, 21:19
von satart
Hallo zusammen,
ich muss ein paar dBase Dateien (Tabellen) bearbeiten.
Bin auf dbfpy gestoßen. Leider weiß ich nicht wie ich eine Zeile
löschen kann. Das lesen bzw. Inhalte verändern geht ohen Probleme.
leider ist mein Python-Kenniss auch nicht mächtig.
Hat jemand von euch Erfahrungen mit dbfpy?
Danke
Verfasst: Mittwoch 17. Dezember 2008, 21:24
von Hyperion
Verfasst: Mittwoch 17. Dezember 2008, 21:27
von satart
Das habe ich auch schon entdeckt
def delete(self):
"""Mark method as deleted."""
self.deleted = True
nur wie verwende ich diese Methode?
Bzw. diese Methode "löscht" doch nicht oder?
Das objekt (was auch immer) wird ja nur als "deleted" markiert.
Verfasst: Mittwoch 17. Dezember 2008, 21:27
von DasIch
Du wirst wahrscheinlich noch einen commit machen müssen oder sowas.
Verfasst: Mittwoch 17. Dezember 2008, 21:29
von satart
sorry, ich kenn mich mit python noch nicht so gut aus:
was meinst du mit "commit"?
Verfasst: Mittwoch 17. Dezember 2008, 21:30
von Hyperion
satart hat geschrieben:sorry, ich kenn mich mit python noch nicht so gut aus:
was meinst du mit "commit"?
Das hat nichts mit Python zu tun, sondern ist ein Konzept aus dem DB Umfeld.
http://de.wikipedia.org/wiki/SQL#Transa ... d_Rollback
Verfasst: Mittwoch 17. Dezember 2008, 21:34
von DasIch
Das hat weniger mit Python als mit Datenbanken generell zu tun.
In diesem Fall könnte es aber sogar sein dass schon:
reicht.
Verfasst: Mittwoch 17. Dezember 2008, 21:42
von satart
mein minimal code sieht so aus:
Code: Alles auswählen
from dbfpy import dbf
db = dbf.Dbf("test.dbf")
print db[0]
db. close()
liefert:
NAME: art (<type 'str'>)
SURNAME: Miller (<type 'str'>)
INITIALS: JM (<type 'str'>)
BIRTHDATE: 1983-04-05 (<type 'datetime.date'>)
liefert
AttributeError: __delitem__
Verfasst: Mittwoch 17. Dezember 2008, 22:04
von Hyperion
Und was sagt delete()?
Verfasst: Mittwoch 17. Dezember 2008, 22:44
von numerix
Ein (bzw. mehrere) Blick(e) in den Quelltext von dbfpy helfen:
Das Löschen von Datensätzen ist nicht vorgesehen. Der Autor hat zwar mal Anlauf genommen, das zu implementieren, hat es aber nicht zu Ende gebracht.

Verfasst: Mittwoch 17. Dezember 2008, 23:00
von Hyperion
Also wäre der workaround eigentlich nur der, eine bereits vorhandene DB einzulesen, die daten intern irgend wie zu mappen und dann nur die gewünschten in eine neue DB zurückzuschreiben, oder?
Wobei es hierbei ja doch nur um Nostalgie gehen kann? Wenn's nur darum geht, die Daten zu retten, sollte man das ganze am besten wirklich nur einlesen und dann in ein anderes RDBMS mappen.
Verfasst: Mittwoch 17. Dezember 2008, 23:56
von BlackJack
Wieso nur Nostalgie? DBF war mal ein sehr beliebtes Format, weil so schön einfach, da läuft sicher noch Unmengen an Individualsoftware mit.
Verfasst: Donnerstag 18. Dezember 2008, 10:41
von satart
Das ist echt schade. Weiß jemand wie man sonst dBase mit Python bewätigen kann?
Sonst muss ich wohl wieder mal mit Java lösen
Verfasst: Donnerstag 18. Dezember 2008, 10:54
von audax
Verfasst: Donnerstag 18. Dezember 2008, 11:11
von BlackJack
@satart: Ich würde sagen einfach `delete()` und `store()` auf dem `DbfRecord`-Exemplar aufrufen.
Ja, dadurch wird der Datensatz nur als "gelöscht" markiert, aber so funktioniert das eben bei DBF-Dateien. Wirklich löschen würde nämlich bedeuten, dass alle Datensätze die danach kommen auf der Platte umkopiert werden müssten. Womit sich dann auch alle Recordnummern der betroffenen Datensätze ändern.
DBase kennt einen Befehl zum Entfernen der markierten Datensätze, den man alle Jubeljahre mal aufgerufen hat, um Platz zu schaffen. Der macht auch nichts anderes als die ganze Datenbank zu kopieren und dabei die als gelöscht markierten auszulassen.
Verfasst: Donnerstag 18. Dezember 2008, 11:15
von querdenker
Ich habe gerade mal in meinem alten DBASE-Buch nachgesehen:
DELETE : Datensatz zum löschen markieren
RECALL : Löschmarkierung wieder aufheben
PACK : Datensatz aus DB löschen
ZAP : Alle Datensätze in der aktiven DB löschen
EDIT: Hilft leider nur direkt in DBASE
Dann wäre der einzige 'sinnvolle' Ansatz nur die gewünschten Daten aus Tabelle A zu selektieren und in Tabelle B zu schreiben.
hth, querdenker
Verfasst: Freitag 19. Dezember 2008, 13:19
von satart
Es gefällt mir überhaupt nicht, dass die Datenbank umkorpiert werden muss,
damit die Zeilen auch wirklich physikalisch gelöscht werden.
Ich werde mal mit Java probieren. Vielleicht lässt sich das ganze
eleganter lösen.
Verfasst: Freitag 19. Dezember 2008, 15:09
von BlackJack
Wieso mit Java? Da hättest Du mit DBF das gleiche Problem. Das ist keine Einschränkung von Python sondern von DBF. Das ist ein total simples Dateiformat wo einfach nach einem Header der die Datensätze beschreibt, die Datensätze nacheinander in der Datei liegen. Und etwas mitten aus einer Datei zu löschen, ohne mindestens alles nachfolgende "nach vorne" zu kopieren, ist halt bei heutigen Dateisystemen nicht möglich. Da ändert auch die Programmiersprache nichts dran.
Verfasst: Freitag 19. Dezember 2008, 15:13
von numerix
satart hat geschrieben:Es gefällt mir überhaupt nicht, dass die Datenbank umkorpiert werden muss,
damit die Zeilen auch wirklich physikalisch gelöscht werden.
Ich werde mal mit Java probieren. Vielleicht lässt sich das ganze
eleganter lösen.
Ich habe noch nicht verstanden, warum du überhaupt eine eigene Anwendung dafür brauchst. Mit OpenOffice z.B. kannst du dBase-Dateien problemlos bearbeiten.
Verfasst: Freitag 19. Dezember 2008, 22:12
von satart
also,
ich will openoffice nicht verwenden, weil der zugriff auf dBase automatisiert werden soll.
Das ist ja auch der Grund warum ich dafür ein Programm schreiben muss.
Bei Java sieht nur etwas besser auch. Auch unter Java gibt es kaum dBase Klassen.
Zum Glück habe ich eine Klasse gefunden, das alle meiner Anforderungen enspricht.
http://www.heinerkuecker.de/DbfEdit.html
Besonders wichtig war es für mich dass die gelöschen Daten auch physikalisch gelöscht werden.
Mir fehlt halt die Zeit und Geduld das Rad neuzuerfinden.
Trotzdem habe ich hier sehr viel über dBase lernen können ....
vielen Dank an alle
