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

我正在尝试使用 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.

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


慕桂英546537
浏览 140回答 1
1回答

慕运维8079593

finally函数中的子句在create_connection返回之前关闭连接。看起来好像您正在尝试为连接创建一种上下文管理器,但 sqlite3 Connection已经是上下文管理器了,所以这是不必要的。你可以做with sqlite3.connect(dbfile) as conn:     print(sqlite3.version)     prepare_data(conn)退出上下文管理器时,连接将自动关闭。您可以通过将上下文管理器包装在try/except块中来捕获上下文管理器内部引发的错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python