为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2023-07-11 14:48:14
我正在尝试使用 python 将一小组行插入 sqlite 并收到错误“无法在封闭的数据库上操作”这是我的代码片段:import sqlite3from sqlite3 import Errordb_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 conndef 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.不确定我的连接在哪里被关闭。可能做了一些非常愚蠢的事情,但希望得到指点?
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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

看起来好像您正在尝试为连接创建一种上下文管理器,但 sqlite3 Connection已经是上下文管理器了,所以这是不必要的。

你可以做

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

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


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信