Seite 1 von 1
SqlObject serialisieren
Verfasst: Freitag 2. November 2007, 00:42
von lunas
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
Verfasst: Freitag 2. November 2007, 09:51
von Leonidas
`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.
Verfasst: Freitag 2. November 2007, 11:55
von Y0Gi
Für ähnliche Zwecke habe ich die Daten einfach in ein Zwischenformat wie YAML oder JSON gebracht und dann wieder andernorts neu eingefügt.
Verfasst: Samstag 3. November 2007, 03:01
von lunas
`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...
Verfasst: Samstag 3. November 2007, 10:22
von Leonidas
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.
Verfasst: Samstag 3. November 2007, 11:57
von Y0Gi
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.
Verfasst: Sonntag 11. November 2007, 00:06
von lunas
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?
Verfasst: Sonntag 11. November 2007, 00:26
von BlackJack
Welch ein Wunder: Wenn Du die Klasse picklest wird auch tatsächlich die Klasse gepickelt. Wer hätte das gedacht.

Verfasst: Sonntag 11. November 2007, 00:36
von lunas
BlackJack hat geschrieben:Welch ein Wunder: Wenn Du die Klasse picklest wird auch tatsächlich die Klasse gepickelt. Wer hätte das gedacht.

Ja, ich war auch ganz erstaunt. Python ist echt manchmal für eine Überraschung gut...

Verfasst: Sonntag 11. November 2007, 11:42
von Leonidas
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.