Как я могу сказать, почему в SQLAlchemy происходит откат? - PullRequest
3 голосов
/ 10 апреля 2011

Когда я вставляю в MySQL с помощью SQLAlchemy, я вижу сообщение «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 ():

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)

Что это за ошибка?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2011

Вы всегда можете распечатать ошибку при возникновении исключения:

try:
    transaction.commit()
except Exception, e:
    session.rollback()
    print str(e)
1 голос
/ 10 апреля 2011

Поиск в документации по Sqlalchemy, чтобы включить ведение журнала d SQL-операторы и Sql-ответы. Обычно это даст вам всю необходимую информацию для дальнейшей отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...