Python mysqldb fetchmany无法正常工作

时间:2014-05-09 03:01:21

标签: python python-2.7 mysql-python

我有一些像这样的代码

if __name__ == '__main__':
    def result_generator(cursor, batch_size=10):
        while True:
            results = cursor.fetchmany(batch_size)
            if not results:
                break
            for res in results:
                yield res

    db = MySQLdb.connect(host="localhost", user="root", passwd="root", db="domains")
    # you must create a Cursor object. It will let
    #  you execute all the queries you need
    cursor = db.cursor()
    cursor.execute("SELECT domain FROM com ORDER BY id ASC")
    for result in result_generator(cursor):
        url = "http://www.{0}".format(result[0])
        print url
        w = Wappalyzer(url)
        out = w.analyze()
        cursor.execute("""UPDATE com SET frameworks=%s, is_checked=1 WHERE domain=%s""",
                       (db.escape_string(out.get('frameworks', "")), result[0]))
    # disconnect from server
    db.commit()
    db.close()

我的result_generator批量从数据库中提取域名。批量大小为10。

我的程序正常IF我删除了这一行

cursor.execute("""UPDATE com SET frameworks=%s, is_checked=1 WHERE domain=%s""",
                           (db.escape_string(out.get('frameworks', "")), result[0]))

否则它只运行第一批。

有人能告诉我我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

在我的脑海中,可能是下一次执行调用时光标的结果被覆盖了吗?

您的SELECT调用会填充结果。对结果生成器的第一次调用工作正常,因为SELECT仍有结果。然后使用相同的光标执行UPDATE,其中"重置"光标结果。因此,下一次调用生成器会导致循环。如果删除UPDATE,则光标结果不会重置,允许循环继续。

这只是猜测。我还没有尝试过。