2010-11-19 6 views
0

나는 sqlalchemy를 배우기위한 주소록의 간단한 데이터베이스 작업을하고있다.SQLAlchemy와 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) 

그리고 이것은 'dbtrans.py'에 코드입니다 : 이것은 'tables.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() 

난 그냥이 dbtrans 실행이 오류마다 시간을 얻을 :

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) 

문제가 있습니까?

답변

1

내가 틀렸다면 오류를 수정하십시오. detailT 인스턴스가 없다는 것을 말하면 detailT 클래스가 인스턴스화 된 곳에서는 볼 수없는 코드를 보게됩니다. detailT는 관계를 통해 nameT의 부모이므로 nameT를 부모없이 저장할 수 없다는 것을 알게됩니다. 나는 여기서 시작할 것입니다.

+0

당신이 옳았습니다! 감사! – ArashM

+1

Arash M, 맞다면 올바른 대답을 선택하십시오 :) –

0

그냥 'detailT'클래스의 관계를 제거하고 같은 'namesT'에 추가 :

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

을 지금은 일하고있어!

관련 문제