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

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

Mittwoch 17. Dezember 2008, 21:19

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: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 17. Dezember 2008, 21:24

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

Mittwoch 17. Dezember 2008, 21:27

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: 2480
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 17. Dezember 2008, 21:27

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

Mittwoch 17. Dezember 2008, 21:29

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

Mittwoch 17. Dezember 2008, 21:30

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: 2480
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 17. Dezember 2008, 21:34

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

Mittwoch 17. Dezember 2008, 21:42

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: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 17. Dezember 2008, 22:04

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

Mittwoch 17. Dezember 2008, 22:44

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: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 17. Dezember 2008, 23:00

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

Mittwoch 17. Dezember 2008, 23:56

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

Donnerstag 18. Dezember 2008, 10:41

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

Donnerstag 18. Dezember 2008, 10:54

Jython!

JPype!
BlackJack

Donnerstag 18. Dezember 2008, 11:11

@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.
Antworten