在execute(sql)之后调用fetchall()是否会再次读取数据?

2024-09-28 17:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚学习了如何使用MySQLDb包for python,并且熟悉从select语句中获取行。在

cursor.execute("SELECT movie_list_....")
result = cursor.fetchall()

我注意到,当我运行第一个命令时,它显示123L,即受影响的行数。当我运行第二个命令时,数据实际上被获取了。在

当我执行fetchall()操作时,它是否会以当时存在的任何状态再次读取数据库?在

我所担心的含义是这样的:我执行了一个影响30行的select操作。我一次处理10个cursor.fetchmany(10) 一。然后我把这10个数字加起来(这是一个例子!)。前两次迭代进展顺利,但在第三次迭代之前,对影响相同行的表运行了更新。然后进行第三次迭代。在

那么,我的总和是否会反映select查询时的数据库?或者是新旧价值观的混合体?在

我记得大学里有个叫“肮脏的问题”。但它是在一次读取所有行的上下文中进行的,而不是像fetchmany()那样进行批处理。在

请告诉我我在解决这个问题的数据库理论方面的空白。在


Tags: 数据命令数据库forexecute语句resultmovie
1条回答
网友
1楼 · 发布于 2024-09-28 17:22:08

这取决于您使用的是“普通”、客户端游标还是服务器端游标。在

在内部,客户端一号(CS)使用^{},而服务器端一号(SS)使用^{}。在

CS one(通常)是最受欢迎的,因为它在发送查询后立即获取所有数据。这对于随后的服务器来说要少得多,因为可以释放表。因此,如果您逐个获取数据,服务器将无法识别,因为所有数据都是本地的,并且您在查询时拥有数据的快照。在

如果您有很多数据,或者希望第一个数据快速出现,可以采用SS方法。但是,您必须更加注意对数据库的操作,并且可能在一个单独的线程中获取数据,尽快完成这项任务,以减少数据库的负载,因为在发送和获取所有数据之前,表都是打开和锁定的。因此,读取时也不会发生数据更改,但其他数据库用户可能会因为表锁过长而延迟。在

相关问题 更多 >