【问题标题】:Python cursor is returning number of rows instead of rowsPython游标返回行数而不是行数
【发布时间】:2013-09-12 21:26:29
【问题描述】:

编写脚本来清理一些数据。超级未优化,但这个游标是 返回类似查询中的结果数而不是行我做错了什么。

#!/usr/bin/python
import re
import MySQLdb
import collections

db = MySQLdb.connect(host="localhost", # your host, usually localhost
                     user="admin", # your username
                      passwd="", # your password
                      db="test") # name of the data base

# you must create a Cursor object. It will let
#  you execute all the query you need
cur = db.cursor() 

# Use all the SQL you like
cur.execute("SELECT * FROM vendor")

seen = []

# print all the first cell of all the rows
for row in cur.fetchall() :
    for word in row[1].split(' '):
        seen.append(word)

_digits = re.compile('\d')
def contains_digits(d):
    return bool(_digits.search(d))


count_word = collections.Counter(seen)
found_multi = [i for i in count_word if count_word[i] > 1 and not contains_digits(i) and len(i) > 1]

unique_multiples = list(found_multi)

groups = dict()

for word in unique_multiples:
    like_str = '%' + word + '%'
    res = cur.execute("""SELECT * FROM vendor where name like %s""", like_str)

【问题讨论】:

  • 这里至少有两个execute 语句。哪一个做错了?
  • 最后一个。 “喜欢”声明

标签: python mysql python-2.7 sql-like


【解决方案1】:

您正在存储cur.execute() 的结果,即行数。你永远不会真正获取任何结果。

执行后使用.fetchall()获取所有结果行或遍历游标:

for word in unique_multiples:
    like_str = '%' + word + '%'
    cur.execute("""SELECT * FROM vendor where name like %s""", like_str)
    for row in cur:
        print row

【讨论】:

  • MySQLdb 中需要fetchall() 吗?使用 sqlite3,你可以只做for row in cur:——而且通常应该这样做。除了更简单之外,它还更快(除了通常的避免不必要的列表之外,循环 fetchmany() 允许 sqlite 和/或应用程序选择理想的数组大小)。
  • MySQLdb 有点过时,使用游标作为迭代器在DB-API 2.0 spec 中仅列为可选。目前无法测试,但 IIRC MySQLdb 不支持。
  • 更正:支持.__iter__(),但使用.fetchone()
  • IIRC,MySQLdb 的fetchmany 无论如何都没用;底层引擎已经在批处理,所以fetchmany 只使用fetchone 共享的相同批处理(类似于batch[row:min(row+size, batchsize)] 而不是batch[row])。 __iter__ 使用 fetchone 是有意义的,如果它更简单且同样快速。
  • 我看到了两种游标类型;一种总是一次性获取所有结果,另一种是逐行获取。我没有看到批量提取,也没有在我链接的cursors.py 文件中。默认是获取所有内容,这意味着迭代和.fetchall() 之间没有区别,真的。
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2015-05-05
相关资源
最近更新 更多