【问题标题】:Cannot operate on a closed cursor in sqlite3 python无法在 sqlite3 python 中对关闭的游标进行操作
【发布时间】:2017-12-25 23:22:29
【问题描述】:

我一直在关注这个 YouTube 播放列表中的这个 5 部分教程:https://www.youtube.com/playlist?list=PLQVvvaa0QuDezJh0sC5CqXLKZTSKU1YNo

我将 Jupyter notebook 与 Python 结合使用,代码如下:

import sqlite3
import time
import datetime
import random

conn = sqlite3.connect("tutorial2.db")
c = conn.cursor()

然后我创建了几个函数。

def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS stuffToPlot (unix REAL, datestamp TEXT,
    keyword TEXT, value REAL)')

def data_entry():

    c.execute("INSERT INTO stuffToPlot VALUES (145123542, '2016-01-03',
              'Python', 7)")
    conn.commit()
    c.close()
    conn.close()

create_table()
data_entry()

第一次运行良好,并在 C:\Users\Michael 中生成一个 db 文件 但是,当我再次尝试仅运行 create_table() 函数时,出现以下错误:

ProgrammingError: Cannot operate on a closed cursor.

任何能够帮助解决此问题的人将不胜感激!

【问题讨论】:

  • 您需要再次打开连接并创建光标才能使用它,或者将“关闭”移动到另一个方法
  • 是的,因为您明确关闭了 data_entry 中的游标。为什么这让你感到惊讶?

标签: python database sqlite cursor jupyter-notebook


【解决方案1】:

错误非常明确:您无法在关闭的游标上运行查询。更糟糕的是,您在第一次调用 data_entry() 函数时也关闭了连接。

我建议为每个查询打开一个游标,然后在完成查询后关闭它,并且只在脚本末尾关闭连接:

import sqlite3
import time
import datetime
import random

conn = sqlite3.connect("tutorial2.db")

def create_table():
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS stuffToPlot (unix REAL, datestamp TEXT, keyword TEXT, value REAL)')
    c.close()

def data_entry():
    c = conn.cursor()
    c.execute("INSERT INTO stuffToPlot VALUES (145123542, '2016-01-03', 'Python', 7)")
    conn.commit()
    c.close()


create_table()
data_entry()

通过在完成所有查询后移动conn.close() 语句,并仅在需要时打开游标,错误将不再发生。

编辑:您的视频中发生的情况如下:

  1. 他首先执行了整个脚本一次。
  2. 他计算了创建表格的行。
  3. 他第二次执行整个脚本。

我认为您可能是在 python 交互式会话中输入命令,这与他在视频中所做的不等效,因为当他重新执行脚本时,会创建一个新的连接和光标,而如果您'只是尝试再次调用该函数,游标和连接已经关闭,导致错误。

【讨论】:

  • 感谢Thundzz 的回复。我评论了#conn.commit(),然后又评论了#c.close(),然后再次运行了这两个函数,但得到了同样的错误。此外,我正在关注的视频教程没有出现任何错误,如他的视频中 10:05 所示。 https://www.youtube.com/watch?v=o-vsdfCBpsU&list=PLQVvvaa0QuDezJh0sC5CqXLKZTSKU1YNo
  • 感谢Thundzz,您的代码有效。我完全是 sqlite3 的菜鸟,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 2013-03-26
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多