考虑这个表
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()
命令。
答案 0 :(得分:0)
web2py将每个HTTP请求包装在数据库事务中。如果请求期间发生异常,则将回滚事务。否则,在请求结束时,在返回响应之前,事务将被提交(因此所有插入/更新操作将在那时提交)。
如果在应用程序代码中显式调用db.commit()
,则事务将立即提交,而不是等到请求结束。任何后续操作都将成为新交易的一部分。
在上述两种情况下,所有更新都将同时提交。唯一的区别是,在第一种情况下,提交将在返回HTTP响应之前由框架发出(假设没有中间异常触发回滚),在第二种情况下,提交在运行后立即发生更新循环。
在选项2中,如果您在循环中移动了db.commit()
调用,那么确实会一次提交一个更新,而不是一次提交。
另外,请注意,要更新记录,您不需要先选择它,如果要将相同的更新应用于许多记录,您不需要一次更新一条记录,但是而是将更新应用于表示所有记录的DAL Set对象:
db(db.people.id > 0).update(name='Bob')
上面定义了db.people
表中的一组记录(在这种情况下,是所有记录),然后更新" name"所有这些记录的字段。此操作不涉及从数据库中选择的任何记录。