SqlObject serialisieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Hallo,

auf meinem shared host server habe ich leider keinen direkten Zugriff auf die MySQL Datenbank von ausserhalb des Servers (also nur über localhost). Da ich aber Daten von ausserhalb speichern möchte und auch die Einfachheit von sqlobject schätze, dachte ich mir, dass ich die erzeugten Objekte doch einfach serialisieren und via HTTP hochladen könnte. Leider konnte ich nicht herausfinden wie man sqlobject serialisiert.

Hat vielleicht jemand einen Tipp oder möglicherweise eine bessere Alternative wie ich die Daten auf den Webserver bekomme?

lg,
lunas
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

`pickle` hat nicht funktioniert?

Eine Möglichkeit wäre es einen SQL-Dump verwenden, eine andere Möglichkeit wäre es, die SQL-Objekte in einer Datei erstellen zu lassen und diese auf dem Server ausführen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Für ähnliche Zwecke habe ich die Daten einfach in ein Zwischenformat wie YAML oder JSON gebracht und dann wieder andernorts neu eingefügt.
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

`pickle` hat nicht funktioniert?
Ist das Dateiformat denn unter Linux und Windows das gleichen?
Für ähnliche Zwecke habe ich die Daten einfach in ein Zwischenformat wie YAML oder JSON gebracht und dann wieder andernorts neu eingefügt.
Das klingt mir nach zu viel Aufwand...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunas hat geschrieben:Ist das Dateiformat denn unter Linux und Windows das gleichen?
Ja. Solltest nur nicht vergessen, die Dateien im Binärmodus zu öffnen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

lunas hat geschrieben:
Für ähnliche Zwecke habe ich die Daten einfach in ein Zwischenformat wie YAML oder JSON gebracht und dann wieder andernorts neu eingefügt.
Das klingt mir nach zu viel Aufwand...
Um in eines oder aus einem der beiden Formate zu serialisieren, bedarf es mit den entsprechenden Paketen (z.B. ``PyYAML`` respektive ``simplejson``) nur einen Aufruf.

Beim Einlesen der so serialisierten Daten etwa habe ich sofort ein Dictionary, dessen Schlüssel meinen Tabellennamen entsprechend und dessen Werte jeweils eine Liste von Dictionaries der Tabellenrecords sind. Für jeden dieser Records muss ich dann nur ein neues Objekt erstellen (die Klasse richtet sich nach dem Tabellennamen) und schon habe ich die Daten in der Datenbank.

Ein beispielhaftes Create-/Import-Script kann etwa so aussehen:

Code: Alles auswählen

from __future__ import with_statement

import yaml

from myapp.model import *  # evil!


model_classes = [Person, Address, ContactInformation]

for mc in model_classes:
    print '*** Dropping table for %s model...' % mc.__name__
    mc.dropTable(ifExists=True)
    print '*** Creating table for %s model...' % mc.__name__
    mc.createTable(ifNotExists=True)

print '*** Inserting initial data...'
with open('export.yaml', 'rb') as f:
    data = yaml.safe_load(f)
for mc in model_classes:
    mc_name = mc.__name__.lower()
    mc_data = data.get(mc_name)
    if mc_data is None:
        print 'No data found for class %s, skipping.' % mc_name
        continue
    for values in mc_data:
        mc(**values)
print '*** Done.'
Ein Export-Script muss umgekehrt nur für jede Tabelle alle Datensätze (z.B. in Form von als Dictionaries) holen und diese Daten dann alle serialisieren.
Zuletzt geändert von Y0Gi am Samstag 3. November 2007, 11:59, insgesamt 2-mal geändert.
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Also wenn ich versuche eine slqobject Klasse zu pickeln, dann wird lediglich die Klasse, aber nicht deren Tabelleinträge gespeichert.

Code: Alles auswählen


class MyTable(sqlobject.SQLObject)
    item = sqlobject.IntCol()

MyTable(item=2)
pickle.dump(MyTable, open('mytable.pickle', 'w' ))
Obiger Abschnitt funktioniert nicht, da die Werte (in diesem Fall für 'item') nicht mit abgespeichert werden. Gibt es noch eine andere Möglichkeit an die Daten von MyTable zu gelangen?
BlackJack

Welch ein Wunder: Wenn Du die Klasse picklest wird auch tatsächlich die Klasse gepickelt. Wer hätte das gedacht. :roll:
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

BlackJack hat geschrieben:Welch ein Wunder: Wenn Du die Klasse picklest wird auch tatsächlich die Klasse gepickelt. Wer hätte das gedacht. :roll:
Ja, ich war auch ganz erstaunt. Python ist echt manchmal für eine Überraschung gut... :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunas hat geschrieben:Obiger Abschnitt funktioniert nicht, da die Werte (in diesem Fall für 'item') nicht mit abgespeichert werden. Gibt es noch eine andere Möglichkeit an die Daten von MyTable zu gelangen?
Ja, die Werte auslesen und wie Y0Gi vorgeschlagen hat etwa in YAML oder JSON abzuspeichern.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten