没有 web2py 的 DAL

Posted

技术标签:

【中文标题】没有 web2py 的 DAL【英文标题】:DAL without web2py 【发布时间】:2011-01-09 02:31:56 【问题描述】:

我正在使用 web2py 为我的网站提供动力。我决定将 web2py DAL 用于在站点后面运行的长时间运行的程序。 该程序似乎不更新其数据或数据库(有时)。

from gluon.sql import *
from gluon.sql import SQLDB

from locdb import * 
# contains
# db = SQLDB("mysql://user/pw@localhost/mydb", pool_size=10)
# db.define_table('orders', Field('status', 'integer'), Field('item', 'string'),
#    migrate='orders.table')
orderid = 20 # there is row with id == 20 in table orders
#when I do 
db(db.orders.id==orderid).update(status=6703)
db.commit()

它不会更新数据库,并且选择具有此 ID 的订单会显示正确的数据。在某些情况下,提交后的“db.rollback()”似乎会有所帮助。

至少可以说很奇怪。你见过这个吗?更重要的是你知道解决方案吗?


更新: 更正: 有问题的选择是在程序内完成的,而不是在程序外完成的。

有时,在进行一系列更新时,有些可以工作并且在外面可用,有些则不可用。此外,一些查询将返回它最初返回的数据,即使数据在数据库中自 th4 原始查询以来发生了变化。

我很想放弃这种方法并转向另一种方法,有什么建议吗?

【问题讨论】:

注意db对象不能跨线程共享。 【参考方案1】:

这个问题已经解决了: mysql运行在隔离级别REPEATABLE READ(即事务一旦开始,select输出中反映的数据直到事务结束才会改变)。它需要将隔离级别更改为 READ COMMITED 并解决了问题。顺便说一下,R​​EAD COMMITED 是 Oracle 和 mssql 默认运行的隔离级别。 这可以在 my.cnf 中设置。详情见以下链接:

http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html

【讨论】:

以上是关于没有 web2py 的 DAL的主要内容,如果未能解决你的问题,请参考以下文章

web2py:DAL find() 不工作

默认情况下,级联上的 web2py 数据库抽象层 (DAL) 引用是啥?

将 MySQL 查询转换为在 web2py DAL 中使用

Web2py DAL 查找最新日期的记录

可以将带有子查询的 Mysql 查询转换为 web2py DAL 吗?

在 web2py DAL 中查询空值