背景:
我最终试图加入两个位于完全不同数据库中的表。我已经将数据加载到数据帧中,目的是通过 sqldf 执行 SQL 连接(因为连接是不等式的,而且我对 SQL 很熟悉,但在 python 中不太舒服)。
环境:
- Anaconda 上的 Jupyter 笔记本
- 熊猫SQL 0.7.3
- Numpy 1.14.3
- SQLAlchemy 1.2.7
- Python 3.6.5
- 视窗 10
问题:
我可以使用一个简单的内置数据集和一个非常简单的查询来重现这个问题。以下代码:
from pandasql import sqldf, load_meat
meat = load_meat()
print(sqldf("SELECT * FROM meat;",locals()))
返回:
OperationalError:SQL 变量太多
最终,这会追溯到 sqlite3,其中“INSERT INTO”语句为每一行使用一组 8 元组参数,然后将值传递给这些参数:
SQL: 'INSERT INTO meat (date, beef, veal, pork, lamb_and_mutton, broilers, other_chicken, turkey)
VALUES (?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?),
....
(?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?)']
[parameters: ('1944-01-01 00:00:00.000000', 751.0, 85.0, 1280.0, 89.0, None, None, None, '1944-02-01 00:00:00.000000', 713.0, 77.0, 1169.0, 72.0, None, None, None,
....
我还通过将简单的 CSV 加载到数据框 (500,2) 中重现了此错误。如果我将 CSV/df 从 500 行减少到 499 行,那么 sqldf 可以正常工作。
为了寻找解决方案,我阅读了大量关于 SQLite 的 999 参数限制的信息。但是,我已经看到很多 使用内置数据集的 示例。尤其是最后一个示例,它直接来自 pandasql 存储库。运行该示例中的代码,处理 iris 数据 (150x6) 的部分运行良好,而肉类数据 (827x8) 导致上述参数错误。
我在StackOverflow上找到了有关此问题的另一个参考,但那里没有任何活动。