2011-04-10 87 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字段爲「120L」,而不是「120」)。這可能與這個問題有關嗎?

這裏是做插入的Python代碼:

@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 * classes/tables的模型定義提取,這將有所幫助。 – van 2011-04-12 08:17:09

+1

數字後面的字母L只表示它是長整數。 – plaes 2011-05-10 09:01:43

回答

1

當異常發生時您可以隨時打印出錯誤:

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

我添加了嘗試/除了沒有打印出來的控制檯。除了總是需要拋出回滾事件嗎? – 2011-04-10 18:32:37

+0

只需要在刷新而不是提交。它打印了這一點: 「(IntegrityError)(1452,「不能添加或更新子行,外鍵約束失敗('metrics'.'pageview',約束'pageview_ibfk_1'外鍵('unit_id')參考' unit'('id')) ')' INSERT INTO網頁瀏覽(時間,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,無)」 任何想法做什麼的呢? – 2011-04-10 18:34:50

+0

除非我能看出你的模型是如何設置的,否則很難說:S – plaes 2011-04-10 20:18:20

1

搜索Sqlalchemy文檔以啓用對SQL語句和Sql響應的日誌記錄。這通常會爲您提供所有相關信息以供進一步調試。

相關問題