You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:33:20