【问题标题】:SELECT in a while loop in python with mysql用mysql在python中的while循环中选择
【发布时间】:2017-06-17 12:22:11
【问题描述】:

我正在尝试使用带有 SELECT MAX(id) 的查询来查找 MySQL 数据库中的最新条目。我已经获得了最新的 id,所以我知道查询有效,但现在我想在 while 循环中使用它,所以每次迭代时我都会不断获得最新的条目。

这是我目前所拥有的:

import pymysql

con = pymysql.connect(host='.....', user='.....',
                      password='.....', database='.....')

cur = con.cursor()

while True:
    query = "SELECT MAX(id) FROM reports"
    cur.execute(query)
    data = cur.fetchall()
    last = (data[0][0])
    print(last)

问题是更新数据库后我一直得到相同的结果。例如,现在我有 45 个条目,所以我的脚本在 while 循环中打印 '45'。但是在我向表中添加另一行后,它会继续打印“45”而不是我期望的“46”。当我停止脚本并再次运行它时,它会打印 '46' 并在我添加另一行后继续打印。

我大约两周前才开始使用 MySQL,所以我对它的了解并不多。我觉得我在这里错过了一些非常小的东西。我该怎么办?任何帮助将不胜感激。

【问题讨论】:

  • 尝试暂停循环。它运行得如此之快,以至于在您更新数据库之前它会执行数百或数千次查询。您会看到所有这些旧查询的输出。
  • 你必须创建一个新的游标来拉取新数据。或者按照这个答案stackoverflow.com/a/23683656/3901060 的建议,提交查询。
  • @FamousJameous 这个答案就是我想要的。我没有意识到我也必须提交 SELECT 语句。谢谢!

标签: python mysql select while-loop database-cursor


【解决方案1】:

我也遇到了同样的问题,只是想让其他正在寻找解决方案的人明白这一点。

将自动提交设置为 True 解决了我的问题,并且不需要在每次查询后调用提交。

import pymysql

con = pymysql.connect(host='.....', user='.....',
                  password='.....', database='.....')
con.autocommit = True
cur = con.cursor()

while True:
    query = "SELECT MAX(id) FROM reports"
    cur.execute(query)
    data = cur.fetchall()
    last = (data[0][0])
    print(last)

Here is a link to the documentation

【讨论】:

  • 是的,非常感谢,每次查询后都不需要自动提交
  • 虽然它有效,但为什么自动提交对 SELECT 有意义?提交对更新有意义,但这里有什么意义呢?
  • 哈。找到了我上面问题的答案:“关闭自动提交后,在使用 InnoDB 或 NDBCluster 等事务存储引擎时必须提交事务。” dev.mysql.com/doc/connectors/en/… 好像很奇怪..
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2019-04-18
  • 2015-06-15
  • 2012-02-27
相关资源
最近更新 更多