【问题标题】:How can I tell why a rollback is happening in SQLAlchemy?如何判断 SQLAlchemy 中发生回滚的原因?
【发布时间】:2011-04-10 07:57:59
【问题描述】:

当我使用 SQLAlchemy 插入 MySQL 时,我看到消息“ROLLBACK”出现在开发服务器的输出日志中。如何判断回滚发生的原因?

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() 上执行 try/except 时出现以下异常:

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 负责相关对象的正确插入顺序。但是,情况似乎是您对数据库有 FK 约束,但 SA 模型上可能缺少它。如果您发布包含 pageviewunit 类/表的模型定义摘录,将会有所帮助。
  • 数字后面的字母 L 表示它是长整数。

标签: python mysql sqlalchemy pyramid


【解决方案1】:

发生异常时,您总是可以打印出错误:

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

【讨论】:

  • 我添加了 try/except 但没有任何东西打印到控制台。是否总是需要抛出异常才能发生回滚?
  • 只需要在刷新而不是提交时进行。它打印出来:“(IntegrityError)(1452,'无法添加或更新子行:外键约束失败(metrics.pageview,约束pageview_ibfk_1外键(unit_id)参考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)" 有什么想法吗?
  • 很难说除非我能看到你的模型是如何设置的:S
【解决方案2】:

搜索 Sqlalchemy 文档以启用 generatef 的日志记录 d SQL 语句和 Sql 响应。这通常会为您提供所有相关信息以供进一步调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2012-01-14
    • 2013-03-27
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多