當我用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)
這是什麼錯誤發生?
該錯誤信息是明確的。 SA處理相關對象的正確INSERT順序。然而,似乎是這樣的,你對數據庫有FK約束,但它可能在SA模型上缺失。如果您發佈涵蓋* pageview *和* unit * classes/tables的模型定義提取,這將有所幫助。 – van 2011-04-12 08:17:09
數字後面的字母L只表示它是長整數。 – plaes 2011-05-10 09:01:43