首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sqlite -不能在关闭的数据库上操作

Sqlite -不能在关闭的数据库上操作
EN

Stack Overflow用户
提问于 2020-09-03 00:00:00
回答 1查看 1.2K关注 0票数 0

我正在尝试使用python在sqlite中插入一小部分行,但得到一个错误消息"Cannot operate on a closed database“。

这是我的代码片段:

代码语言:javascript
运行
复制
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)

得到以下错误-

代码语言:javascript
运行
复制
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.

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-03 00:11:47

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

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

你可以做到

代码语言:javascript
运行
复制
with sqlite3.connect(dbfile) as conn:
    print(sqlite3.version)
    prepare_data(conn)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63709229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档