我刚学会使用 Python 的 MySQLDb 包,我熟悉从 select 语句中获取行。
cursor.execute("SELECT movie_list_....")
result = cursor.fetchall()
我注意到,当我运行第一个命令时,它显示 123L,受影响的行数。当我运行第二个命令时,实际上已获取数据。
当我执行 fetchall() 时,它是否会以当时存在的任何状态再次读取数据库?
我担心的含义 是这样的示例:我执行了一个影响 30 行的选择操作。我通过 cursor.fetchmany(10) 一次处理 10 个。然后我将这 10 个数字相加(这是一个例子!)。前两次迭代进展顺利,但在第三次迭代之前,对影响相同行的表运行了更新。然后发生第三次迭代。
那么,我的总和会反射(reflect)选择查询时的数据库吗?还是新旧值(value)观的混合体?
我记得在大学里有个叫做“脏读问题”的东西。但它是在一次读取所有行的上下文中,而不是像 fetchmany() 那样批量。
请填补我在解决此问题的数据库理论方面的空白。
最佳答案
这取决于您使用的是“普通”客户端游标还是服务器端游标。
在内部,客户端一 (CS) 使用 mysql_store_result()
, 而服务器端 (SS) 使用 mysql_use_result()
.
CS 一个(通常)受到青睐,因为它在发送查询后立即获取所有数据。这对于随后的服务器来说工作要少得多,因为表可以被释放。因此,如果您逐条获取数据,服务器将无法识别,因为所有数据都在本地,并且您在查询时有数据的快照。
如果你有很多数据,或者希望第一个快速出现,你可以采用 SS 方法。但是你必须更加关心你对数据库做了什么,也许在一个单独的线程中获取数据,尽快完成这个任务以减少数据库的负载,因为表保持打开和锁定直到所有数据都被读取发送和获取。因此,在读取时也不会发生数据更改,但其他数据库用户可能会由于较长的表锁定而延迟。
关于python - execute(sql) 后调用fetchall() 是不是第二次读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130610/