Seite 1 von 1

mit SQLAlchemy während __init__ Object abspeichern

Verfasst: Donnerstag 21. Mai 2009, 10:14
von Liffi
Ich versuche bei einer Klasse schon während des __init__ Aufrufs das entstandene Objekt mit SQLAlchemy zu speiechern. Das schlägt jedoch fehl, weil ich das Objekt scheinbar nicht richtig anspreche. (Das mappen und erzeugen wäre normalerweise außerhalb von __init__, ich wollte das Beispiel nur möglichst kompakt gestalten)

Code: Alles auswählen

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData,\
          ForeignKey
from sqlalchemy.orm import mapper, sessionmaker

class User(object):
    def __init__(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

        engine = create_engine('mysql://user@localhost/datenbank', echo=True)
        metaData = MetaData(engine)
        users_table = Table('users', metaData, autoload=True)
        mapper(User, users_table)
        Session = sessionmaker(bind=engine, autoflush=True, autocommit=True)
        session = Session()
        session.add(self)

firstUser = User('Hallo', 'Spencer')
Wie wäre der korrekte Weg mein Ziel zu erreichen?

EDIT:: Die Fehlermeldung hinzugefügt:
sqlalchemy.orm.exc.UnmappedInstanceError: Class '__main__.User' is mapped, but this instance lacks instrumentation. Possible causes: instance created before sqlalchemy.orm.mapper(__main__.User) was called, or instance was pickled/depickled without instrumentationinformation.

Verfasst: Donnerstag 21. Mai 2009, 11:46
von OverNord
Der Fehler kommt, weil eine Instanz der Klasse erstellt wurde, bevor diese gemappt wurde. Lass einfach das mappen und das erstellen einer Session aus der Klasse. Das hinzufügen zur Session in __init__ ist aber kein Problem.

mfg. Björn

Verfasst: Donnerstag 21. Mai 2009, 12:00
von Liffi
OverNord hat geschrieben:Der Fehler kommt, weil eine Instanz der Klasse erstellt wurde, bevor diese gemappt wurde. Lass einfach das mappen und das erstellen einer Session aus der Klasse. Das hinzufügen zur Session in __init__ ist aber kein Problem.
oh, das ging ja dann einfacher als ich dachte :-).
Danke

Verfasst: Freitag 22. Mai 2009, 11:14
von sma
Funktioniert der Ansatz denn auch, wenn man Daten wieder auslesen will? Ich würde vermuten, SQLalchmy wird Objekte regulär erzeugen (also damit auch __init__ aufrufen), um sie dann mit Daten aus der Datenbank zu füllen. Wenn aber der reine Aufruf sofort wieder neue (leere) Objekte speichert... ihr versteht?

Stefan

Verfasst: Freitag 22. Mai 2009, 11:34
von OverNord
So weit ich weiß, ruft SQLAlchemy nicht __init__ auf. Sonst würden einige Sachen nicht so richtig funktionieren.

Verfasst: Freitag 22. Mai 2009, 11:42
von DasIch
__init__ wird nur aufgerufen wenn man die Klasse selbst instanziert. SQLAlchemy ruft __init__ nie auf.

Verfasst: Freitag 22. Mai 2009, 13:11
von Y0Gi
So isses. `__init__` wurde bewusst für eigene Anpassungen freigehalten.