我有这样的代码
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,则不会重置游标结果,从而允许循环继续。
这只是一个猜测。我还没试过。
