我正在尝试在 docker 容器内的卷上创建一个 sqlite db。当执行到达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 容器之外运行,这就是为什么我想知道这是否与 alpine 或 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”标志,但仍然出现相同的错误。
谢谢,
这与 无关docker
。从文档:
finally 子句总是在离开 try 语句之前执行,无论是否发生异常。
这很容易测试,b
无论如何都会存在:
try:
a = int(2)
except:
pass
finally:
b = 3
print(b)
所以块中close()
的连接没有意义finally
。我看不出有任何理由在这个函数中关闭连接,因为它只尝试做一件事:打开一个连接。连接成功或失败,因此不需要关闭(实际上,close()
在异常处理程序中调用可能会引发错误,因为名称conn
将不存在)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句