Sqlite - 无法在关闭的数据库上操作

Sqlite - Cannot operate on a closed database

我正在尝试使用 python 将一小组行插入到 sqlite 中,但出现错误“无法在已关闭的数据库上操作”

这是我的代码片段:

import sqlite3
from sqlite3 import Error

db_file = "/home/sosuser/mediaserver/camera.db"

def create_connection(db_file):
    conn = None
    try:
        conn = sqlite3.connect(db_file)
        print(sqlite3.version)
    except Error as e:
        print(e)
    finally:
        if conn:
            conn.close()
    return conn

def create_task(conn, task):
    sql = ''' INSERT INTO camerainfo(id, cameraid, maplat, maplong, name)
              VALUES(?,?,?,?,?) '''
          
    cur = conn.cursor()
    cur.execute(sql, task)

def prepare_data(conn):
    for cam in range(len(camID)):
        print(camID[cam])
        task = (cam, camID[cam], '12.972442','77.580643','testCAM')
        create_task(conn, task)

    conn.commit()
    conn.close()

conn = create_connection(db_file)
prepare_data(conn)

得到如下错误-

Traceback (most recent call last):
  File "dumpCamera1.py", line 92, in <module>
    prepare_data(conn)
  File "dumpCamera1.py", line 86, in prepare_data
    create_task(conn, task)
  File "dumpCamera1.py", line 79, in create_task
    cur = conn.cursor()
sqlite3.ProgrammingError: Cannot operate on a closed database.

不确定我的连接在哪里关闭。可能做了一些非常愚蠢的事情,但希望得到指点?

谢谢。

create_connection 函数中的 finally 子句在返回之前关闭连接。

看起来您正在尝试为连接创建一种上下文管理器,但是一个 sqlite3 Connection is already a context manager,所以这是不必要的。

你可以做到

with sqlite3.connect(dbfile) as conn:
    print(sqlite3.version)
    prepare_data(conn)

连接将在退出上下文管理器时自动关闭。您可以通过将上下文管理器包装在 try / except 块中来捕获上下文管理器内部引发的错误。