3

在 IPython 笔记本实例中通过 SQLAlchemy 连接时出现OperationalError: (OperationalError) database is locked错误,我不知道为什么。

我使用 SQLAlchemy 和 Declarative Base 语法为 SQLite 数据库编写了 Python 接口。我将数据库模型导入 IPython 笔记本以探索数据。今天早上这工作得很好。这是代码:

from psf_database_interface import session, PSFTable
query = session.query(PSFTable).first()

但是今天下午,在我关闭运行 IPython 的笔记本电脑后(它重新启动服务器就好了),我开始收到这个错误。这很奇怪,因为我仍然可以从 SQLite3 命令行工具打开数据库并查询数据。我不希望任何其他进程连接到该数据库并fuser在该数据库上运行确认这一点。我的应用程序没有使用任何并发进程(在我编写的代码中,如果某些东西隐藏在 SQLAlchemy 或 IPython 中,则为 IDK),即使我只是在执行读取操作,SQLite 确实支持并发。

我尝试重新启动 IPython 内核以及终止并重新启动 IPython 笔记本服务器。我已经尝试创建数据库的备份并按照此处的建议用备份替换数据库:https ://stackoverflow.com/a/2741015/1216837 。最后,出于绝望,我尝试添加以下内容以查看是否可以以某种方式清除会话中卡住的内容:

print session.is_active
session.flush()
session.close()
session.close_all()
print session.is_active

哪个返回TrueTrue。有任何想法吗?

更新:我可以在没有任何问题的情况下运行导致 python 文件错误的代码片段,该问题仅发生在 IPython 中。

4

1 回答 1

0

我遇到了同样的问题。我可以运行 python 脚本,但 IPython 会引发以下异常。

您需要检查fuser有没有使用它的进程。但是,如果您找不到任何东西并且您的命令历史记录对您来说并不重要,您可以使用以下解决方法。

当我删除/home/my_user/.ipython/profile_default/history.sqlite文件时,我可以启动 IPython。正如我上面提到的,历史是空的。

    $ ipython                                                             
    [TerminalIPythonApp] ERROR | Failed to create history session in /home/my_user/.ipython/profile_default/history.sqlite. History will not be saved.
    Traceback (most recent call last):
    File "/home/esadrfa/libs/anaconda3/lib/python3.6/site-packages/IPython/core/history.py", line 543, in __init__
        self.new_session()
    File "<decorator-gen-22>", line 2, in new_session
    File "/home/esadrfa/libs/anaconda3/lib/python3.6/site-packages/IPython/core/history.py", line 58, in needs_sqlite
        return f(self, *a, **kw)
    File "/home/esadrfa/libs/anaconda3/lib/python3.6/site-packages/IPython/core/history.py", line 570, in new_session
        self.session_number = cur.lastrowid
    sqlite3.OperationalError: database is locked
    [TerminalIPythonApp] ERROR | Failed to open SQLite history :memory: (database is locked).
于 2018-06-09T03:07:58.650 回答