有没有一种方法可以使用sqlite3在python中重置光标?

时间:2019-01-28 00:12:35

标签: python sqlite

以下代码中的外部循环仅执行一次。我明白为什么。显然,光标一次只能做一件事,而我注释掉的那一行干扰了我的循环。

我想我可以创建第二个连接,但是如果可能的话,我想避免这种情况。有没有一种方法可以将光标位置存储在有问题的代码行的前面,并在之后立即将其恢复?

        cursor.execute('SELECT ...;')
        fetch=cursor.fetchone()
        while(fetch):
            ...
            while(endTime<=timeEnd):
                if(timeZero<=startTime):
#                   cursor.execute("INSERT INTO chronology ...")
                ...
            fetch=cursor.fetchone()

2 个答案:

答案 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情况:

  1. (弱)通常是通过调用C库来处理获取的。因此,使用fetchall()可以避免在C和python之间切换太多
  2. 已知
  3. (强)在循环内执行多次INSERT的速度很慢,即使SQL引擎已经缓存了SQL命令的解析结果。通常,在这种情况下,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游标。