以下代码中的外部循环仅执行一次。我明白为什么。显然,光标一次只能做一件事,而我注释掉的那一行干扰了我的循环。
我想我可以创建第二个连接,但是如果可能的话,我想避免这种情况。有没有一种方法可以将光标位置存储在有问题的代码行的前面,并在之后立即将其恢复?
cursor.execute('SELECT ...;')
fetch=cursor.fetchone()
while(fetch):
...
while(endTime<=timeEnd):
if(timeZero<=startTime):
# cursor.execute("INSERT INTO chronology ...")
...
fetch=cursor.fetchone()
答案 0 :(得分:2)
不。您不能(嗯....取决于库,但通常不是)。这是游标的定义。但是,您可以有多个游标来执行此操作:
cursor = conn.cursor()
write_cur = conn.cursor()
cursor.execute('SELECT ...;')
fetch=cursor.fetchone()
while(fetch):
...
write_cur.execute("INSERT ...")
...
fetch = cursor.fetchone()
但是,在这种情况下,我通常使用fetchall()
而不是fetchone()
并准备出于性能原因所需的所有INSERT情况:
fetchall()
可以避免在C和python之间切换太多executemany()
的速度要快得多,允许将list
的绑定参数传递给INSERT(请参见How does binding parameters work in SQLite3 (with minimal example)?)如果这样做,则不需要另一个光标。
答案 1 :(得分:0)
FWIW,MySQL Python connector cursors也似乎不支持任何类型的重置功能,尽管某些Python API(例如here中提到的ArcGIS)显然具有可重置的游标。
在希望将游标移交给对象工厂(或其他代码)进行处理之前,想要遍历游标一次以验证或调试查询结果的情况下,重置游标的功能将非常方便。遍历光标后,可以在进行后续处理之前将其重置。
在declared as scroll时,可重置Transact-SQL游标。