【问题标题】:Python MySQLdb iterate through tablePython MySQLdb遍历表
【发布时间】:2013-03-02 02:12:07
【问题描述】:

我有一个 MSQL 数据库,我需要遍历一个表并在满足 WHERE 子句时执行一个操作。然后一旦它到达桌子的尽头,回到顶部并重新开始。

目前我有

cursor = database.cursor()    
cursor.execute("SELECT user_id FROM round WHERE state == -1 AND state = 2")  
round_id = cursor.fetchone()

if round != 5
   ...do stuff

在一个循环中,但这显然只会循环第一个条目。我想您需要使用 for in 函数来读取表格,但我不确定如何使用 mysqldb 来执行此操作?

【问题讨论】:

  • 您可以通过反复调用cursor.fetchone()(例如在while中)直到它返回(None,)来获得查询结果
  • 我相信你可以简单地通过你的cursor.execute()做一个for循环
  • @PurityLake 不,你不能。 cursor.execute 返回行数。你可以做for item_idx in range(cursor.execute()): something = cursor.fetchone()
  • 抱歉,几乎没有扫描过执行函数
  • @DJV,我花了一段时间才找到一个权威的答案(没有 MySQL 数据库可以玩这个代码测试很棘手),很多例子显示 .execute() 返回行数,但 Python 数据库 API规范 v2.0 明确表示没有,所以我选择了.rowcount

标签: python mysql mysql-python


【解决方案1】:

在光标中有结果后,您可以直接在其中进行迭代。

cursor = database.cursor()    
cursor.execute("SELECT user_id FROM round WHERE state == -1 AND state = 2")  
for round in cursor:
  if round[0] != 5
    ...do stuff

【讨论】:

  • 你能解释一下你刚才写的东西是用标签还是手动写的......因为我很难理解它@codeforester
【解决方案2】:

这会将游标设置在结果集的开头并告诉您它返回了多少行(我在这一行上来回走动,但this is the most authoritative documentation我发现,旧的 Python MySQLdb 库在执行时返回了行数,但是Python Database API Specification v2.0没有,这个应该是最兼容的)

cursor.execute("SELECT user_id FROM round WHERE state = -1 OR state = 2")
numrows = cursor.rowcount

会告诉你得到了多少行作为回报

for x in xrange(0,numrows):
  row = cursor.fetchone()
  print row[0], "-->", row[1]

将遍历每一行(不需要用范围枚举 x)

【讨论】:

  • 值得注意的是查询错误
  • 现在不可能了:)
  • 啊哈哈,这就是我试图修复一个明显的错误而不阅读整个内容的结果:P
  • for large tables do "for x in xrange(0,numrows)" xrange 是生成器,而 range 创建一个列表对象,对于大 numrows 需要时间和内存
  • 如果您只选择 user_id,您是否会有一行[1]?
猜你喜欢
  • 2012-05-05
  • 2013-02-18
  • 1970-01-01
  • 2018-03-08
  • 2015-10-07
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多