2012-10-11 69 views
1

这里是我的情况: 第一视图呈现形式,数据去SECEND视图,其中i其存储在数据库(MySQL的)和重定向到显示了被写入数据库第三种观点:的SQLAlchemy /金字塔DBSession刷新问题

Stoing to db: 
    DBSession.add(object) 
    transaction.commit() 

DB Session: 
    DBSession = scoped_session(sessionmaker(expire_on_commit=False, 
              autocommit=False, 
              extension=ZopeTransactionExtension())) 

之后,当我刷新我的页面几次有时我可以看到数据库更改,有时不会,一次旧数据,第二次新的等等...当我重新启动服务器(本地,pserve)DB数据是最新。

也许这是创建会话的问题?

+1

你能编辑你的问题,以显示DBSession变量的确切位置以及如何从第二个视图重定向到第三个?您还可以提供一个粗略的视图功能 – Sergey

回答

0

检查MySQL的transaction isolation level

InnoDB的默认值为REPEATABLE READ:“同一事务中的所有一致读取读取第一次读取建立的快照。”

您可以在调用create_engine时指定隔离级别。请参阅SQLAlchemy docs

我建议你尝试一下READ COMMITTED隔离级别,看看能否解决你的问题。

+0

对不起,它没有帮助 - 保存到数据库和重定向后同样的问题 - 有一次,当我刷新我有新的数据,第二次旧的,几经刷新后“稳定” – papaduda

+0

嗯。我唯一能想到的其他事情就是''ZopeTransactionExtension''。我不确定它做了什么,你可以尝试没有它? – codeape

+0

ZopeTransactionExtension确保每个打开的会话都加入一个活动的事务,没有它就是一样的。 – papaduda

0

缓存怎么样?

输出是否缓存在服务器端?

浏览器是否显示旧的缓存版本的页面?

0

您不清楚您的事务对象是什么或者它如何连接到SQLAlchemy数据库会话。我在金字塔文档中看不到有关事务的任何内容,并且在代码中没有看到任何将您的事务对象链接到SQLAlchemy会话的东西,因此可能缺少一些配置。基于这个代码的例子是什么?

另外:sessionmaker调用通常在文件评分中完成,以创建单个会话工厂,然后重复使用该会话工厂从同一来源创建会话对象。 "the sessionmaker() function is normally used to create a top level Session configuration which can then be used throughout an application without the need to repeat the configurational arguments."

可能出现这种情况,因为您正在创建多个会话工厂,因此有一些数据应该在会话间共享,但实际上不会共享,因为它在每个工厂都创建一次。尝试just calling sessionmaker once,看看是否有所作为。

0

我相信你的问题可能是一个持续的会话。默认情况下,在提交之后,金字塔将在会话中过期所有对象 - 这意味着SQLA将在您下次希望它们从数据库中获取它们,并且它们将是新鲜的。

您已通过指示“expire_on_commit = False”覆盖了此默认值 - 因此,如果您打算让该会话对象在后续请求中获取新数据,请确保在提交更改后调用session.expire_all()。 (会话对象是在金字塔的多个请求相同,但你不能保证得到相同的线程范围会)我不建议设定到期承诺虚假,或使用非全局会话:看http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#using-a-non-global-session

或者,您可以确保您在需要时到期的对象,知道未到期的对象将保留在内存中会是这样的,不会被刷新,并且可以从同一个对象在不同的​​线程范围的会议有所不同。