2010-11-19 1 views
0

Ich arbeite gerade an einer einfachen Datenbank eines Adressbuchs für das Lernen von SQLLechemy. Dies ist der Code unter der 'tables.py' Datei (das ist ziemlich wie ein im Tutorial!):Stuck in SQLAlchemy und Object Rlational

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from sqlalchemy import Column, Integer, String, create_engine, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref 

engine = create_engine('sqlite:///phone.db', echo=True) 
Base = declarative_base() 

class namesT(Base): 

    __tablename__ = 'Names' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    sirname = Column(String) 
    job = Column(String) 
    work = Column(String) 

    def __init__(self, namesTuple): 
     self.name, self.sirname, self.job, self.work = namesTuple 
     print self.name, self.sirname, self.job, self.work 

    def __repr__(self): 
     return '%s, %s, %s, %s' % (self.name, self.sirname, self.job, self.work) 

class detailT(Base): 

    __tablename__ = "Details" 

    id = Column(Integer, primary_key=True) 
    names_id = Column(Integer, ForeignKey('Names.id')) 
    type = Column(String) 
    info = Column(String) 
    detail = Column(String) 

    names = relationship(namesT, backref='Details', order_by=id, cascade="all, delete, delete-orphan") 


    def __init__(self, detailsTuple): 
     self.type, self.info, self.detail = detailsTuple 
     print self.type, self.info, self.detail 

    def __repr__(self): 
     return "%s, %s, %s" % (self.type, self.info, self.detail) 

Base.metadata.create_all(engine) 

Und dies ist der Codes in dem 'dbtrans.py':

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from tables import engine as engine 
from tables import namesT as names 
from sqlalchemy.orm import sessionmaker 

class transaction: 
    def __init__(self): 
     self.Session = sessionmaker(bind=engine) 
     self.session = self.Session() 

    def insert_in_names(self, namesTuple): 
     print namesTuple 
     ed = names(namesTuple) 
     self.session.add(ed) 
    def find(self): 
     self.session.query(names).filter(names.name=='ed').all() 

    def commitAll(self): 
     self.session.commit() 

if __name__ == "__main__": 
    tup = ('Blah', 'Blah', 'Blah', 'Blah') 
    ins = transaction() 
    ins.insert_in_names(tup) 
# print ins.sessQuery() 
    ins.commitAll() 

bekomme ich nur diese Störung jedes Mal, wenn ich die dbtrans laufen:

sqlalchemy.orm.exc.FlushError: Instance <namesT at 0x14538d0> is an unsaved, pending instance and is an orphan (is not attached to any parent 'detailT' instance via that classes' 'names' attribute) 

wo ist das Problem?

Antwort

1

Bitte korrigieren Sie mich, wenn ich falsch liege, aber der Fehler besagt, dass es keine detailT-Instanz gibt und ich den Code nicht sehen kann, wo die detailT-Klasse instanziiert wird. Es sieht für mich so aus, dass detailT das übergeordnete Element von nameT ist, und zwar über die Beziehung, in der nameT ohne das übergeordnete Element nicht gespeichert werden kann. Ich würde hier anfangen.

+0

Sie hatten Recht! Vielen Dank! – ArashM

+1

Arash M, wenn sie Recht haben, wählen Sie ihre Antwort als richtig :) –

0

entfernt einfach die Beziehung von ‚detailT‘ Klasse und fügte hinzu, es zu ‚Namest‘ wie folgt aus:

details = relationship("detailT", backref='namesT', order_by=id, cascade="all, delete, delete-orphan") 

arbeitet es jetzt!