我正在尝试在docker容器中的卷上创建一个sqlite数据库。执行到达c = conn.cursor()
时,会收到以下错误:
sqlite3.ProgrammingError: Cannot operate on a closed database.
我想重新使用连接过程,因此构建了以下函数,我认为这可能是问题所在:
def create_sqlite_conn(db):
try:
conn = sqlite3.connect(db, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
return conn
except sqlite3.Error as e:
logging.warning("WARNING: Error accessing DB: {}".format(db), e)
finally:
conn.close()
def create_db(db):
conn = create_sqlite_conn(db)
c = conn.cursor()
c.execute('''CREATE TABLE table1(id INTEGER PRIMARY KEY AUTOINCREMENT, ip_ver TEXT, date_time DATETIME)''')
conn.commit()
这称为:
create_db('/home/web/data/new_db.sql')
此代码在docker容器之外运行,这就是我想知道这是高山还是与docker相关的原因。我的docker文件如下所示:
FROM alpine:3.7
RUN apk --no-cache add python3 build-base linux-headers python3-dev \
&& pip3 install virtualenv \
&& addgroup -g 500 web \
&& adduser -D -u 1000 -G web web
WORKDIR /home/web
ENV PYTHONPATH /home/web/myapp
USER web
RUN mkdir -p /home/web/env /home/web/myapp /home/web/data/
COPY myapp/__init__.py /home/web/myapp/
COPY myapp/myapp.py /home/web/myapp/
COPY setup.py /home/web/myapp/
COPY requirements.txt /home/web/myapp/
COPY README.txt /home/web/myapp/
RUN /usr/bin/virtualenv -p python3 /home/web/env \
&& source /home/web/env/bin/activate \
&& python -m pip install ./myapp/ \
&& python -m pip install -r ./myapp/requirements.txt
VOLUME ["./data"]
CMD ["/home/web/env/bin/myapp"]
启动docker容器我尝试使用和不使用'--privileged'标志,但仍然会收到相同的错误。
谢谢,
答案 0 :(得分:2)
这与docker
无关。来自the docs:
在离开try语句之前总是执行finally子句, 是否发生了例外。
这很容易测试,b
将存在,无论如何:
try:
a = int(2)
except:
pass
finally:
b = 3
print(b)
因此,对close()
块中的finally
连接没有意义。我没有看到任何理由在这个函数中完全关闭连接,因为它只尝试做一件事:打开一个连接。连接成功或失败,因此不需要关闭(事实上,在异常处理程序中调用close()
可能会抛出错误,因为名称conn
将不存在。)