2011-04-10 4 views
3

SQLAlchemy를 사용하여 MySQL에 삽입하면 개발 서버의 출력 로그에 "ROLLBACK"메시지가 나타납니다. 롤백이 발생하는 이유를 어떻게 알 수 있습니까?SQLAlchemy에서 롤백이 발생하는 이유를 어떻게 알 수 있습니까?

2011-04-10 00:35:32,736 INFO [sqlalchemy.engine.base.Engine.0x...4710][MainThread] INSERT INTO pageview (time, unit_id, visitor_id, url_id, referrer_id, reservation_id, visit_id) VALUES (%s, %s, %s, %s, %s, %s, %s) 
2011-04-10 00:35:32,736 INFO [sqlalchemy.engine.base.Engine.0x...4710][MainThread] (datetime.datetime(2011, 1, 31, 0, 1, 53), 120L, 5538L, 11075L, 11076L, 5538L, None) 
2011-04-10 00:35:32,737 INFO [sqlalchemy.engine.base.Engine.0x...4710][MainThread] ROLLBACK 
Starting server in PID 10158. 
serving on 0.0.0.0:6543 view at http://127.0.0.1:6543 

나는 문자 "L"이 모든 외부 키 값을 후 (다음 unit_id 필드 대신 "120"의 "120L"입니다 예)를 나타 납니까. 그것이이 문제와 관련이있을 수 있습니까?

@classmethod 
def unconverted(class_): 
    session = DBSession() 
    return session.query(class_).filter(class_.pageview == None).order_by(class_.time).limit(5).all() 

@classmethod 
def convert_all(class_): 
    session = DBSession() 

    unconverted = class_.unconverted() 
    for item in unconverted: 

     pageview = PageView(raw_request=item) 
     item.pageview = pageview 
     session.add(item) 

    session.flush() 
    transaction.commit() 
    session.close() 

편집 : 여기

은 삽입하고있다 파이썬 코드 plaes의 조언에 따라

을, (은 Session.flush 제외/시도 할 때 나는 다음과 같은 예외가) :

2011-04-10 11:33:44,462 INFO [sqlalchemy.engine.base.Engine.0x...3750][MainThread] ROLLBACK 
(IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`metrics`.`pageview`, CONSTRAINT `pageview_ibfk_1` FOREIGN KEY (`unit_id`) REFERENCES `unit` (`id`))') 'INSERT INTO pageview (time, unit_id, visitor_id, url_id, referrer_id, reservation_id, visit_id) VALUES (%s, %s, %s, %s, %s, %s, %s)' (datetime.datetime(2011, 1, 31, 0, 1, 53), 120L, 5608L, 11215L, 11216L, 5608L, None) 

이 오류는 무엇입니까?

+0

오류 메시지가 분명하다. SA는 관련 오브젝트의 적절한 INSERT 순서를 처리합니다. 그러나이 경우에는 데이터베이스에 FK 제약 조건이 있지만 SA 모델에서 누락 된 것일 수 있습니다. * pageview * 및 * unit * 클래스/테이블을 다루는 모델 정의 추출을 게시하면 도움이됩니다. – van

+1

숫자 다음의 문자 L은 단지 Long 정수임을 나타냅니다. – plaes

답변

1

당신은 항상 오류를 인쇄 할 수 있습니다 :

try: 
    transaction.commit() 
except Exception, e: 
    session.rollback() 
    print str(e) 
+0

나는 try/except를 추가했지만 아무 것도 콘솔에 출력되지 않습니다. 롤백이 발생하려면 예외가 항상 throw되어야합니까? –

+0

그냥 커밋 대신 플러시 할 필요가 있습니다. "(IntegrityError) (1452, '자식 행을 추가하거나 업데이트 할 수 없음 : 외래 키 제약 조건이 실패 함 ('metrics'.pageview', CONSTRAINT'pageview_ibfk_1') FOREIGN KEY ('unit_id') REFERENCES' VALUES (% s, % s, % s, % s, % s, % s, % s, % s, % s, % s, % s, % s, % s) s) '(datetime.datetime (2011, 1, 31, 0, 1, 53), 120L, 5608L, 11215L, 11216L, 5608L, 없음) " 어떤 아이디어가 필요합니까? –

+0

모델 설정 방법을 알 수 없으면 알기가 어렵습니다. S – plaes

1

SQL 문과 SQL 응답의 생성에 대한 로깅을 사용하려면 Sqlalchemy 설명서를 검색하십시오. 이것은 보통 더 자세한 디버깅을위한 모든 관련 정보를 제공합니다. 예외가 발생하면

관련 문제