2014-01-13 4 views
0

일대 다 관계 (한 항목은 많은 의견을 가질 수 있음)를 사용하여 데이터베이스의 항목에 주석을 추가하는 간단한 시스템을 설정했습니다. 하지만 나는 그것이 작동하도록 할 수 없습니다. 그것은 간단해야합니다. 아마도 내가 간과 한 것이있을 것입니다. 나는 이것에 대해 두 번째 눈을 아주 많이 appriciate 것이다. 누구든지 도와 줄 수 있습니까?피라미드, SQLAlchemy에서 일대 다 관계에 개체 추가

내보기에서
class Item(Base): 
    __tablename__ = 'items' # Parent 
    id = Column(Integer, primary_key=True) 
    comments = relationship("Comment", backref='items') 

class Comment(Base): 
    __tablename__ = 'comments' # Child 
    id = Column(Integer, primary_key=True) 
    comment_text = Column(Text, nullable=False) 
    item_id = Column(Integer, ForeignKey('items.id'), nullable=False) 

    def __init__(self, comment_text, item_id): 
     self.comment_text = comment_text 
     self.item_id = item_id 

, 나는 몇 가지 작업을 수행 한 후 주석 객체를 추가하려고 :

I는 다음과 같습니다 SQLAlchemy의 정의 모델이

item = DBSession.query(Item).filter(Item.id == item_id).first() 

try: 
    print('Item id:', item.id, 'Comment text:', comment) 
    print('Item Comments:', item.comments) 
    cm = Comment(comment_text=comment, 
       item_id=item.id) 
    print('a') 
    item.comments.append(cm) 
    #DBSession.add(cm) 
    print('b') 
    DBSession.commit() 
except: 
    DBSession.rollback() 
    print('c') 

참고하는 I 동일한 결과를 가진 item.comments.append (cm)와 DBSession.add (cm)를 시도했습니다. 이것이 위의 코드 블록에서 둘 중 하나가 주석 처리 된 이유입니다. 나는 또한 item.comments.append (Comment (...))와 동일한 결과를 보았습니다. 같이 디버그 인쇄를 포함하여,

sqlalchemy.exc.ResourceClosedError: This transaction is closed 

전체 추적 :

Item id: 1 Comment text: test 
Item Comments: [] 
a 
c 
Traceback (most recent call last): 
    File "C:\Python33\lib\wsgiref\handlers.py", line 137, in run 
    self.result = application(self.environ, self.start_response) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid\router.py", line 251, in __call__ 
    response = self.invoke_subrequest(request, use_tweens=True) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid\router.py", line 227, in invoke_subrequest 
    response = handle_request(request) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid\tweens.py", line 21, in excview_tween 
    response = handler(request) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid_tm\__init__.py", line 82, in tm_tween 
    reraise(*exc_info) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid_tm\compat.py", line 13, in reraise 
    raise value 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\pyramid_tm\__init__.py", line 70, in tm_tween 
    manager.commit() 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_manager.py", line 111, in commit 
    return self.get().commit() 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_transaction.py", line 280, in commit 
    reraise(t, v, tb) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_compat.py", line 55, in reraise 
    raise value 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_transaction.py", line 271, in commit 
    self._commitResources() 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_transaction.py", line 417, in _commitResources 
    reraise(t, v, tb) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_compat.py", line 55, in reraise 
    raise value 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\transaction\_transaction.py", line 394, in _commitResources 
    rm.tpc_vote(self) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\zope\sqlalchemy\datamanager.py", line 100, in tpc_vote 
    self.tx.commit() 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\sqlalchemy\orm\session.py", line 352, in commit 
    self._assert_active(prepared_ok=True) 
    File "C:\Users\[user]\PYTHON~1.5\lib\site-packages\sqlalchemy\orm\session.py", line 203, in _assert_active 
    raise sa_exc.ResourceClosedError(closed_msg) 
sqlalchemy.exc.ResourceClosedError: This transaction is closed 
+0

는 'DBSession.add (cm) 인쇄 ('B') DBSession.flush()' –

+0

어떻게'Item'와'Log' 모델은 관련이 시도? – van

+0

@van 죄송합니다, 오타. – Etni3s

답변

1

을 잘 내가 코멘트를 추가 할 때 이제

는, 나는 절정하는 스택 트레이스를 얻을 수 , 문제가 몇 부패한 파일이 아니라 프로그래밍 오류가 밝혀졌습니다. 한숨. 문제는 해결되었습니다. :)

+0

손상된 파일은 무엇입니까? 서버에 복사 된 소스 코드 파일? 데이터베이스 자체? 나는 똑같은 문제가 있고 대답을 찾지 못하고있다. (환경 : pyramid_tm, Zope을 사용한 피라미드). 다른 DB 트랜잭션은 다른 모델에서 잘 작동합니다. 동일한 API 호출에서 여러 테이블에 추가 할 때 오류가 발생합니다. – hamx0r

관련 문제