Skip to main content
 首页 » 编程设计

Python mysqldb fetchmany 无法正常工作

2024年11月01日23mayingbao

我有这样的代码

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])) 

否则它只运行第一批。

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

请您参考如下方法:

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

您的 SELECT 调用会填充结果。对结果生成器的第一次调用工作正常,因为仍然有来自 SELECT 的结果。然后您使用同一个游标执行 UPDATE,这将“重置”游标结果。因此,对生成器的下一次调用终止了循环。如果删除 UPDATE,则不会重置游标结果,从而允许循环继续。

这只是一个猜测。我还没试过。