我刚刚学习了如何使用MySQLDb包for python,并且熟悉从select语句中获取行。在
cursor.execute("SELECT movie_list_....")
result = cursor.fetchall()
我注意到,当我运行第一个命令时,它显示123L,即受影响的行数。当我运行第二个命令时,数据实际上被获取了。在
当我执行fetchall()操作时,它是否会以当时存在的任何状态再次读取数据库?在
我所担心的含义是这样的:我执行了一个影响30行的select操作。我一次处理10个cursor.fetchmany(10) 一。然后我把这10个数字加起来(这是一个例子!)。前两次迭代进展顺利,但在第三次迭代之前,对影响相同行的表运行了更新。然后进行第三次迭代。在
那么,我的总和是否会反映select查询时的数据库?或者是新旧价值观的混合体?在
我记得大学里有个叫“肮脏的问题”。但它是在一次读取所有行的上下文中进行的,而不是像fetchmany()那样进行批处理。在
请告诉我我在解决这个问题的数据库理论方面的空白。在
这取决于您使用的是“普通”、客户端游标还是服务器端游标。在
在内部,客户端一号(CS)使用^{} ,而服务器端一号(SS)使用^{} 。在
CS one(通常)是最受欢迎的,因为它在发送查询后立即获取所有数据。这对于随后的服务器来说要少得多,因为可以释放表。因此,如果您逐个获取数据,服务器将无法识别,因为所有数据都是本地的,并且您在查询时拥有数据的快照。在
如果您有很多数据,或者希望第一个数据快速出现,可以采用SS方法。但是,您必须更加注意对数据库的操作,并且可能在一个单独的线程中获取数据,尽快完成这项任务,以减少数据库的负载,因为在发送和获取所有数据之前,表都是打开和锁定的。因此,读取时也不会发生数据更改,但其他数据库用户可能会因为表锁过长而延迟。在
相关问题 更多 >
编程相关推荐