DuckDB删除DataFrame数据行报Can only delete from base table错误
错误原因
DuckDB的DELETE属于数据修改类语句,这类语句仅支持对已注册到连接内的基础表执行写入修改。当你直接在SQL语句中引用Pandas DataFrame时,DuckDB默认将其作为只读的外部映射对象访问,不属于可修改的基础表,因此会抛出RuntimeError: Binder Error: Can only delete from base table!错误。
正确实现方式
根据使用场景选择对应方法即可:
- 仅需获取过滤后的结果(推荐,性能最优、不改动原始数据)
不需要使用DELETE语法,直接通过SELECT查询过滤掉不需要的记录,将结果赋值给新DataFrame即可:
import pandas as pd import duckdb test_df = pd.DataFrame.from_dict({"i":[1, 2, 3, 4], "j":["one", "two", "three", "four"]}) con = duckdb.connect(database=':memory:') # 过滤掉i=4的记录,结果转为DataFrame filtered_result = con.execute('SELECT * FROM test_df WHERE i != 4').df()
- 需要使用DELETE语法完成修改
先把Pandas DataFrame注册为DuckDB可写的临时表,执行删除操作后再将结果导出回DataFrame:
import pandas as pd import duckdb test_df = pd.DataFrame.from_dict({"i":[1, 2, 3, 4], "j":["one", "two", "three", "four"]}) con = duckdb.connect(database=':memory:') # 将DataFrame注册为DuckDB临时基础表 con.register('temp_test_table', test_df) # 执行删除操作 con.execute('DELETE FROM temp_test_table WHERE i = 4') # 取回修改后的数据 updated_df = con.execute('SELECT * FROM temp_test_table').df()
注意:第一种直接查询过滤的方式不需要做额外的表注册,不会修改原始DataFrame的数据,日常使用优先选择这种方式即可。
内容的提问来源于stack exchange,提问作者Randy Ledbetter
相关产品推荐
相关产品推荐

