dbfpy(dBase)-wie lösche ich Inhalte einer Tabelle?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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
Zuletzt geändert von satart am Freitag 19. Dezember 2008, 13:21, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

http://dbfpy.cvs.sourceforge.net/viewvc ... iew=markup

Da gibts eine Methode delete() ... evtl. ist es das?
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du wirst wahrscheinlich noch einen commit machen müssen oder sowas.
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

sorry, ich kenn mich mit python noch nicht so gut aus:
was meinst du mit "commit"?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das hat weniger mit Python als mit Datenbanken generell zu tun.

In diesem Fall könnte es aber sogar sein dass schon:

Code: Alles auswählen

del record['anyfield']
reicht.
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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'>)

Code: Alles auswählen

del db[0]
liefert

AttributeError: __delitem__
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und was sagt delete()?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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. :cry:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
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.
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Jython!

JPype!
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.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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.
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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
satart
User
Beiträge: 8
Registriert: Mittwoch 17. Dezember 2008, 21:15

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

:D
Antworten