mit SQLAlchemy während __init__ Object abspeichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

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.
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

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
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

So weit ich weiß, ruft SQLAlchemy nicht __init__ auf. Sonst würden einige Sachen nicht so richtig funktionieren.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

__init__ wird nur aufgerufen wenn man die Klasse selbst instanziert. SQLAlchemy ruft __init__ nie auf.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

So isses. `__init__` wurde bewusst für eigene Anpassungen freigehalten.
Antworten