【问题标题】:Sqlite - Cannot operate on a closed databaseSqlite - 无法在关闭的数据库上操作
【发布时间】:2020-09-02 15:59:59
【问题描述】:

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

这是我的代码 sn-p:

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.

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

谢谢。

【问题讨论】:

    标签: python sqlite connection


    【解决方案1】:

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

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

    你可以的

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2022-04-21
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多