2014-03-03 43 views
1

我正在使用sqlalchemy将数据存储到postgresql数据库中。我有点困惑,sqlalchemy回滚执行时没有抛出异常。我发现了一个article in the documentary并试图通过设置pool_reset_on_return='commit'sqlalchemy回滚的原因

来防止回滚,这实际上导致sqlalchemy不做任何事情。因此,我插入的行明确要求,导致下面的输出:

2014-03-03 18:03:33,390,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: INSERT INTO _fd (**) 
2014-03-03 18:03:33,391,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: {****} 
2014-03-03 18:03:33,392,p:32764 Thread-3, sqlalchemy.engine.base.Engine(__init__) [DEBUG]: Col ('fid',) 
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(process_rows) [DEBUG]: Row (*,) 
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_rollback_impl) [INFO]: ROLLBACK 

的代码退出简单至今:

1837  with conn.begin() as trans:                                                   
1838   statement = meta.tables[_table_name].insert().values(
... 
1847  ) 
1848   res = conn.execute(statement) 
1849   trans.commit() 

有没有人有一个想法,可能是什么原因为了回滚?

回答

0

好吧,我对这种习惯的原因没有粘连,但在声明的末尾添加conn.execute("commit")可以解决问题。

1

不是100%确定的原因,但看source,我们可以看到,当你在with....构造中做时,它将事务设置为不活动。现在当事务的Context Manager尝试在with语句末尾运行__exit__()方法时,它会触发rollback(),因为is_active标志已被设置为False。 (我不知道当你提交一个交易并将其回滚时会发生什么)。

反正“问题”是with构造隐含地处理提交和回滚部分。根据docs,您所需要做的就是

with conn.begin() as trans:  
    statement = meta.tables[_table_name].insert().values(
    ... 
    ) 
    res = conn.execute(statement)