python - execute(sql) 后调用fetchall() 是不是第二次读取数据?

标签 python mysql database

我刚学会使用 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/

相关文章:

python - py/pandas dataframe - 如何将每日收盘价更改为每月收盘价?

ruby-on-rails - 避免 current_user 每次都点击数据库? ruby on Rails

sql - 需要帮助优化 MySQL 查询

mysql - 哪个更有效,DELETE 和 INSERT 或 INSERT 和 UPDATE

php - 在 codeigniter 中将查询保留在 "VIEW"之外

mysql - 更新查询SQL来更新表的各个字段?

mysql - 我如何在 PostgreSQL 中编写这个查询?

python - Python 中有一个迭代字典

python - Python中直线(数字线)上的图形点

python - 将字符串添加到哈希表中