python - “会话/行号在数据库中不是唯一的”之间的依赖关系。错误和 Python 代码
问题描述
一段时间以来,我收到以下错误(警告?):
错误!会话/行号在数据库中不是唯一的。历史记录移至新会话
使用 Jupyter 笔记本时(<XXXX>
是一个数字,例如 9149)。由于 Spyder 报告了同样的错误(Spyder 的警告:“数据库中的会话/行号不是唯一的”),我的猜测是 IPython 内核日志记录存在一些问题。
问题是:运行我的代码和错误之间可能有任何关系吗?
错误可能是由我的代码引起的吗?我触摸 IPython API 如下:
import IPython
def beep():
Python.display.display(IPython.display.Audio(url="http://www.w3schools.com/html/horse.ogg", autoplay=True))
def play_sound(self, etype, value, tb, tb_offset=None):
self.showtraceback((etype, value, tb), tb_offset=tb_offset)
beep()
get_ipython().set_custom_exc((Exception,), play_sound)
我在我的代码中使用该beep()
函数。我还处理导致MemoryError
异常的大数据。
更重要的是,错误是否会影响我的代码行为(假设我不尝试访问日志)?
[编辑] 似乎这个问题与Spyder 的警告不同:“会话/行号在数据库中不是唯一的”,因为我可以使用 Jupyter Notebook 但不能使用 Spyder 来重现它。
解决方案
这只是部分答案 - 赏金仍然符合条件。
该错误确实取决于我的代码 - 至少在有SyntaxError
.
我已经用以下三个单元格复制了它。
In [31]: print(1)
1
In [31]: print 2
File "<ipython-input-32-9d8034018fb9>", line 1
print 2
^
SyntaxError: Missing parentheses in call to 'print'
In [32]: print(2)
2
ERROR! Session/line number was not unique in database. History logging moved to new session 7
如您所见,第二个单元格中的行计数器没有增加(存在语法问题)。
受@zwer 评论的启发,我查询了$HOME/.ipython/profile_default/history.sqlite
数据库:
sqlite> select session, line, source from history where line > 30;
6|31|print(1)
6|32|print 2
7|32|print(2)
很明显,第二个单元格的行计数器在数据库中增加了,但在笔记本中没有。
因此,当第三个单元格成功执行时,笔记本尝试使用同一行存储其源代码,这违反了PRIMARY KEY
约束:
sqlite> .schema history
CREATE TABLE history
(session integer, line integer, source text, source_raw text,
PRIMARY KEY (session, line));
结果,触发了故障保护,发出警告并创建了一个新会话。
我想这个问题不会影响我的代码行为,但是我错过了这样一个声明的可靠来源。
推荐阅读
- javascript - 如何在 React 中动态创建新的全局 CSS 类?
- android - 如何在本地 AOSP 中使用 Repo 工具?
- c++ - 如何使用 OpenMP 并行这两个循环?
- javascript - 防止在html输入字段react.js上输入键
- css - Bootstrap 4没有垂直居中
- android - 隐藏在 Android Studio 中的操作栏
- sql-server - SSMS 编辑单元格无法插入行 - 无效的 uuid - 如何将有效的 uuid 粘贴到编辑前 200 行的单元格中?
- docker - Kubernetes 对 docker 用户命名空间重映射的支持
- reactjs - React 将图像 src 作为对象返回
- python - 单击启用/禁用 WiFi 的 Python 脚本