我正在尝试使用python在sqlite中插入一小部分行,但得到一个错误消息"Cannot operate on a closed database“。
这是我的代码片段:
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.
不确定我的连接在哪里关闭。可能做了一些非常愚蠢的事情,但希望得到一些指点?
谢谢。
发布于 2020-09-03 00:11:47
create_connection
函数中的finally
子句在连接返回之前关闭连接。
看起来您正在尝试为连接创建一种上下文管理器,但是sqlite3 Connection是already a context manager,所以这是不必要的。
你可以做到
with sqlite3.connect(dbfile) as conn:
print(sqlite3.version)
prepare_data(conn)
当退出上下文管理器时,连接将自动关闭。您可以通过将上下文管理器包装在try
/ except
块中来捕获在上下文管理器中引发的错误。
https://stackoverflow.com/questions/63709229
复制相似问题