db.commit() 是为了让您不必多次编辑数据库吗?
Is the db.commit() so that you don't edit the database many times just once?
考虑这个table
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()
命令。
web2py 将每个 HTTP 请求包装在一个数据库事务中。如果请求过程中出现异常,事务将被回滚。否则,在请求结束时,就在返回响应之前,提交事务(因此所有 insert/update 操作都将在那时提交)。
如果您在应用程序代码中显式调用 db.commit()
,那么事务将立即提交,而不是等到请求结束。任何后续操作都将成为新事务的一部分。
在上述两种情况下,所有更新都将同时提交。唯一的区别是,在第一种情况下,提交将在返回 HTTP 响应之前由框架发出(假设没有触发回滚的干预异常),而在第二种情况下,提交会在 [= 之后立即发生30=] 通过更新循环。
在选项 2 中,如果您将 db.commit()
调用移动到循环内,那么更新确实会一次提交一个而不是一次全部提交。
此外,请注意,要更新记录,您不需要先 select 它,如果要对多条记录应用相同的更新,则不需要更新一条记录一次,而是将更新应用于表示所有记录的 DAL Set 对象:
db(db.people.id > 0).update(name='Bob')
上面定义了 db.people
table 中的一组记录(在本例中是所有记录),然后更新所有这些记录的 "name" 字段。此操作不涉及从数据库中 select 编辑的任何记录。
考虑这个table
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()
命令。
web2py 将每个 HTTP 请求包装在一个数据库事务中。如果请求过程中出现异常,事务将被回滚。否则,在请求结束时,就在返回响应之前,提交事务(因此所有 insert/update 操作都将在那时提交)。
如果您在应用程序代码中显式调用 db.commit()
,那么事务将立即提交,而不是等到请求结束。任何后续操作都将成为新事务的一部分。
在上述两种情况下,所有更新都将同时提交。唯一的区别是,在第一种情况下,提交将在返回 HTTP 响应之前由框架发出(假设没有触发回滚的干预异常),而在第二种情况下,提交会在 [= 之后立即发生30=] 通过更新循环。
在选项 2 中,如果您将 db.commit()
调用移动到循环内,那么更新确实会一次提交一个而不是一次全部提交。
此外,请注意,要更新记录,您不需要先 select 它,如果要对多条记录应用相同的更新,则不需要更新一条记录一次,而是将更新应用于表示所有记录的 DAL Set 对象:
db(db.people.id > 0).update(name='Bob')
上面定义了 db.people
table 中的一组记录(在本例中是所有记录),然后更新所有这些记录的 "name" 字段。此操作不涉及从数据库中 select 编辑的任何记录。