我有一些像这样的代码
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]))
否则它只运行第一批。
有人能告诉我我的代码有什么问题吗?
答案 0 :(得分:2)
在我的脑海中,可能是下一次执行调用时光标的结果被覆盖了吗?
您的SELECT调用会填充结果。对结果生成器的第一次调用工作正常,因为SELECT仍有结果。然后使用相同的光标执行UPDATE,其中"重置"光标结果。因此,下一次调用生成器会导致循环。如果删除UPDATE,则光标结果不会重置,允许循环继续。
这只是猜测。我还没有尝试过。