Cython编译后Pandasql执行sqldf查询报sqlite3表不存在错误
解决Cython编译后Pandasql找不到DataFrame的问题
嘿,我碰到过类似的坑!这问题本质上是Cython编译后的函数命名空间和普通Python函数不一样导致的:pandasql的sqldf默认会自动从调用它的函数的局部命名空间里查找DataFrame对应的表名,但Cython会改变内部命名空间的结构,让sqldf没法自动找到你定义的dataf变量,所以才会抛出no such table: dataf的异常。
解决方案:显式传递命名空间给sqldf
你只需要在调用sqldf的时候,手动把包含dataf的命名空间字典传进去,就能绕过这个问题。具体修改你的processor.pyx代码如下:
import pandas as pd from pandasql import sqldf def process_date(json): # json格式为[{"x": "1", "y": "2", "z": "3"}] dataf = pd.read_json(json, orient='records') # 核心修改:构造包含DataFrame的命名空间字典,键名要和SQL里的表名一致 query_namespace = {'dataf': dataf} # 执行查询时通过globals参数传入这个命名空间 # 这里替换成你的实际查询语句即可 result = sqldf("SELECT * FROM dataf", globals=query_namespace) # 后续处理result的逻辑... return result
原理说明
sqldf的globals参数允许我们手动指定查询时使用的命名空间,这样就不用依赖它自动检测调用上下文的命名空间了。通过把dataf放进字典里传给globals,pandasql就能明确找到对应的DataFrame,并把它注册成SQLite的临时表供查询使用。
内容的提问来源于stack exchange,提问作者Zain Qazi




