是db.commit(),这样您就不会多次编辑数据库吗?

时间:2015-07-12 13:49:08

标签: web2py

考虑这个表

db.define_table( 'people' , Field( 'name' ) )

我的理解是我可以像这样更新数据库中的记录:

选项1:

for row in db( db.people ).select():
    row.update_record( name='Bob' )

选项2:

for row in db( db.people ).select( id ):
    db( db.people.id == row.id ).update( name='Bob' )
db.commit()

有什么区别? .commit()命令是否基本上一次完成所有更改,从而在更新期间阻止数据库访问?虽然选项1 一次更新每条记录,因此在两者之间的时间内,可以简单地在update_record命令之间写入数据库?

如果将上面的代码(选项2)放在模块而不是控制器中,那么我的(可能是不正确的)理解是需要db.commit(),因此db.commit()命令。

1 个答案:

答案 0 :(得分:0)

web2py将每个HTTP请求包装在数据库事务中。如果请求期间发生异常,则将回滚事务。否则,在请求结束时,在返回响应之前,事务将被提交(因此所有插入/更新操作将在那时提交)。

如果在应用程序代码中显式调用db.commit(),则事务将立即提交,而不是等到请求结束。任何后续操作都将成为新交易的一部分。

在上述两种情况下,所有更新都将同时提交。唯一的区别是,在第一种情况下,提交将在返回HTTP响应之前由框架发出(假设没有中间异常触发回滚),在第二种情况下,提交在运行后立即发生更新循环。

在选项2中,如果您在循环中移动了db.commit()调用,那么确实会一次提交一个更新,而不是一次提交。

另外,请注意,要更新记录,您不需要先选择它,如果要将相同的更新应用于许多记录,您不需要一次更新一条记录,但是而是将更新应用于表示所有记录的DAL Set对象:

db(db.people.id > 0).update(name='Bob')

上面定义了db.people表中的一组记录(在这种情况下,是所有记录),然后更新" name"所有这些记录的字段。此操作不涉及从数据库中选择的任何记录。