在Jupyter Notebook中使用%sql建表时出现KeyError: 'DEFAULT'
解决Jupyter %sql魔法命令触发KeyError: 'DEFAULT'问题
这个报错的核心原因是**ipython-sql(%sql魔法命令的依赖库)与新版本prettytable存在兼容性冲突**:新版本prettytable移除了DEFAULT样式常量,但ipython-sql的resultset.py代码仍在尝试调用这个已被删除的常量,从而触发KeyError。
解决方案
1. 降级prettytable到兼容版本
这是最直接的修复方式,将prettytable降级到3.8.0版本(该版本仍保留DEFAULT常量):
在Jupyter Notebook中执行:
!pip install prettytable==3.8.0
执行后重启Notebook内核即可生效。
2. 修改SqlMagic的样式配置
无需降级,直接指定prettytable当前支持的样式(如PLAIN_COLUMNS、GRID、MSWORD_FRIENDLY等):
在执行CREATE TABLE语句前,先运行配置命令:
%config SqlMagic.style='PLAIN_COLUMNS'
之后再执行SQL创建语句即可。
3. 临时修改库文件(不推荐)
若无法降级或修改配置,可手动调整ipython-sql的代码:
- 找到文件路径:
你的conda环境路径\Lib\site-packages\sql\run\resultset.py - 定位到第466行:
_style = prettytable.__dict__[self._config.style.upper()] - 将
self._config.style.upper()替换为存在的样式常量,比如'PLAIN_COLUMNS',修改后代码:_style = prettytable.__dict__['PLAIN_COLUMNS']
保存文件后重启Notebook内核即可。
额外提示
你的代码存在一个逻辑问题:
- 第一行
%sql sqlite:///dataProgramming.db连接的是本地文件数据库 - 但创建表的
%%sql sqlite://连接的是内存数据库,创建的表不会保存到dataProgramming.db文件中,关闭Notebook后数据会丢失。
建议统一连接字符串,将创建表的代码改为:
%%sql sqlite:///dataProgramming.db CREATE TABLE users ( FirstName VARCHAR(30) NOT NULL, LastName VARCHAR(30) NOT NULL, USERID INT NOT NULL UNIQUE, PRIMARY KEY (USERID) );
内容的提问来源于stack exchange,提问作者GnosisTek
相关产品推荐
相关产品推荐

