Python-如何防止MySQLdb游标更新干扰fetchmany?
我当前的代码只运行前10行 由于我使用的是Python-如何防止MySQLdb游标更新干扰fetchmany?,python,mysql-python,Python,Mysql Python,我当前的代码只运行前10行 由于我使用的是fetchmany函数,它应该通过选择接下来的10行直到结束来连续运行 但是cursor.execute(““”UPDATE…会干扰fetchmanycursor.execute”(“SELECT…) 有人能告诉我什么是防止它的正确方法吗?不要直接执行更新查询,而是将它们放在字符串中,并在遍历选择查询的结果后立即运行它们。是否尝试使用不同的光标(不要将执行选择的光标与执行更新的光标混合使用)@metatoaster是的,我试过了。但是我得到了mysql错
fetchmany
函数,它应该通过选择接下来的10行直到结束来连续运行
但是cursor.execute(““”UPDATE…
会干扰fetchmanycursor.execute”(“SELECT…
)
有人能告诉我什么是防止它的正确方法吗?不要直接执行更新查询,而是将它们放在字符串中,并在遍历选择查询的结果后立即运行它们。是否尝试使用不同的光标(不要将执行选择的光标与执行更新的光标混合使用)@metatoaster是的,我试过了。但是我得到了mysql错误,比如
InnoDB:检查你是否还没有另一个mysqld进程
Hi,我查询了大约1亿行。你认为服务器会以字符串的形式在内存中保存1亿行吗?@Giri你在问题中提到的唯一数字是10。我不能责怪他。你可以轻松地将其包装成一个循环以进行批处理processing@aIKid是的,我忘了提到这一点。我以为你们知道我在使用fetchmany函数时处理的是大行,你们确定你们负担不起将所有域都保存在内存中吗?如果域名是~50字节,它将需要大约5G RAM,这对服务器来说听起来不算太糟糕。
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()