切换到虚拟环境,目前安装的是duckdb v1.5.3。
root@kylin:/par# source tpy313/penv/bin/activate
(penv) root@kylin:/par# python3
Python 3.13.1 (main, Dec 4 2024, 20:55:07) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
(penv) root@kylin:/par# pip list
Package Version
----------------- -----------
duckdb 1.5.3
duckdb-cli 1.5.2
llvmlite 0.47.0
numba 0.65.1
numpy 2.4.6
pandas 2.3.2
pip 24.3.1
polars 1.41.0
polars-runtime-32 1.41.0
pyarrow 24.0.0
python-dateutil 2.9.0.post0
pytz 2026.2
six 1.17.0
tzdata 2026.2
(penv) root@kylin:/par# python3
Python 3.13.1 (main, Dec 4 2024, 20:55:07) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import duckdb
>>> duckdb.sql("explain select 1 a")
┌───────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ explain_key │ explain_value │
│ varchar │ varchar │
├───────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ physical_plan │ ┌───────────────────────────┐\n│ PROJECTION │\n│ ──────────────────── │\n│ a │\n│ │\n│ ~1 │
│ │ row │\n└─────────────┬─────────────┘\n┌─────────────┴─────────────┐\n│ DUMMY_SCAN │\n└───────────────────────────┘\n │
└───────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
>>> duckdb.sql("select 1 a").explain()
'┌───────────────────────────┐\n│ PROJECTION │\n│ ──────────────────── │\n│ a │\n│ │\n│ ~1 row │\n└─────────────┬─────────────┘\n┌─────────────┴─────────────┐\n│ DUMMY_SCAN │\n└───────────────────────────┘\n\n'
>>> print(duckdb.sql("select 1 a").explain())
┌───────────────────────────┐
│ PROJECTION │
│ ──────────────────── │
│ a │
│ │
│ ~1 row │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ DUMMY_SCAN │
└───────────────────────────┘
执行计划显示换行符转义符,这是一个已知问题,用print()就能解决。
>>>
(penv) root@kylin:/par# export https_proxy=http://proxy.aaa:8080/
export http_proxy=http://proxy.aaa:8080/
(penv) root@kylin:/par# pip download duckdb==1.6.0.dev214 -d tpy313/313
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Collecting duckdb==1.6.0.dev214
Downloading https://mirrors.aliyun.com/pypi/packages/0d/bf/76e42be95d36634c21599fcb0295ef21d49c81e02ab5d89ffd2f2d712fe6/duckdb-1.6.0.dev214-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (21.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.9/21.9 MB 4.1 MB/s eta 0:00:00
Saved ./tpy313/313/duckdb-1.6.0.dev214-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Successfully downloaded duckdb
[notice] A new release of pip is available: 24.3.1 -> 26.1.2
[notice] To update, run: pip install --upgrade pip
(penv) root@kylin:/par# pip install duckdb==1.6.0.dev214 -f tpy313/313
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Looking in links: tpy313/313
Collecting duckdb==1.6.0.dev214
Using cached https://mirrors.aliyun.com/pypi/packages/0d/bf/76e42be95d36634c21599fcb0295ef21d49c81e02ab5d89ffd2f2d712fe6/duckdb-1.6.0.dev214-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (21.9 MB)
Installing collected packages: duckdb
Attempting uninstall: duckdb
Found existing installation: duckdb 1.5.3
Uninstalling duckdb-1.5.3:
Successfully uninstalled duckdb-1.5.3
Successfully installed duckdb-1.6.0.dev214
[notice] A new release of pip is available: 24.3.1 -> 26.1.2
[notice] To update, run: pip install --upgrade pip
安装1.6dev需要指定版本号,如要使用代理还要设定http_proxy和https_proxy环境变量。使用保存在本地目录下的whl文件,需要指定–no-index参数,上面忘记写了,恰好缓存中有,也装上了。
(penv) root@kylin:/par#
(penv) root@kylin:/par# python3
Python 3.13.1 (main, Dec 4 2024, 20:55:07) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import duckdb
>>> print(duckdb.sql("select 1 a").explain())
╭─ Projection ───╮
│ Projections: a │
│ ~1 row │
╰────────┬───────╯
╭─ Dummy Scan ───╮
╰────────────────╯
>>> duckdb.sql("select version()")
┌─────────────────┐
│ "version"() │
│ varchar │
├─────────────────┤
│ v1.6.0-dev10027 │
└─────────────────┘
>>>
>>> duckdb.sql("set http_proxy='http://proxy.aaa:8080'")
>>> duckdb.sql("install tpch")
>>> duckdb.sql("load tpch")
>>> duckdb.sql("call dbgen(sf=0.1)")
>>>
>>> duckdb.sql("FROM tpch_queries()limit 1")
┌──────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ query_nr │ query │
│ int32 │ varchar │
├──────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 1 │ SELECT\n l_returnflag,\n l_linestatus,\n sum(l_quantity) AS sum_qty,\n sum(l_extendedprice) AS sum_base_price,\n sum(l_extendedprice * (1 - l_discount)) AS sum_ │
│ │ disc_price,\n sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,\n avg(l_quantity) AS avg_qty,\n avg(l_extendedprice) AS avg_price,\n avg(l_disco │
│ │ unt) AS avg_disc,\n count(*) AS count_order\nFROM\n lineitem\nWHERE\n l_shipdate <= CAST('1998-09-02' AS date)\nGROUP BY\n l_returnflag,\n l_linestatus\nORDER B │
│ │ Y\n l_returnflag,\n l_linestatus;\n │
└──────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
>>> df=duckdb.sql("select query FROM tpch_queries()where query_nr=1").df()
>>> df
query
0 SELECT\n l_returnflag,\n l_linestatus,\n...
>>> s=str(df.iloc[0,0])
>>> s
"SELECT\n l_returnflag,\n l_linestatus,\n sum(l_quantity) AS sum_qty,\n sum(l_extendedprice) AS sum_base_price,\n sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price,\n sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,\n avg(l_quantity) AS avg_qty,\n avg(l_extendedprice) AS avg_price,\n avg(l_discount) AS avg_disc,\n count(*) AS count_order\nFROM\n lineitem\nWHERE\n l_shipdate <= CAST('1998-09-02' AS date)\nGROUP BY\n l_returnflag,\n l_linestatus\nORDER BY\n l_returnflag,\n l_linestatus;\n"
>>> duckdb.sql(s)
┌──────────────┬──────────────┬───────────────┬────────────────┬─────────────────┬────────────────────┬────────────────────┬────────────────────┬─────────────────────┬─────────────┐
│ l_returnflag │ l_linestatus │ sum_qty │ sum_base_price │ sum_disc_price │ sum_charge │ avg_qty │ avg_price │ avg_disc │ count_order │
│ varchar │ varchar │ decimal(38,2) │ decimal(38,2) │ decimal(38,4) │ decimal(38,6) │ double │ double │ double │ int64 │
├──────────────┼──────────────┼───────────────┼────────────────┼─────────────────┼────────────────────┼────────────────────┼────────────────────┼─────────────────────┼─────────────┤
│ A │ F │ 3774200.00 │ 5320753880.69 │ 5054096266.6828 │ 5256751331.449234 │ 25.537587116854997 │ 36002.12382901414 │ 0.05014459706340077 │ 147790 │
│ N │ F │ 95257.00 │ 133737795.84 │ 127132372.6512 │ 132286291.229445 │ 25.30066401062417 │ 35521.32691633466 │ 0.04939442231075697 │ 3765 │
│ N │ O │ 7459297.00 │ 10512270008.90 │ 9986238338.3847 │ 10385578376.585467 │ 25.545537671232875 │ 36000.9246880137 │ 0.05009595890410959 │ 292000 │
│ R │ F │ 3785523.00 │ 5337950526.47 │ 5071818532.9420 │ 5274405503.049367 │ 25.5259438574251 │ 35994.029214030925 │ 0.04998927856184382 │ 148301 │
└──────────────┴──────────────┴───────────────┴────────────────┴─────────────────┴────────────────────┴────────────────────┴────────────────────┴─────────────────────┴─────────────┘
>>> print(duckdb.sql(s).explain())
╭─ Projection ──────────────────────────────────╮
│ Projections: │
│ __internal_decompress_string(#0), │
│ __internal_decompress_string(#1), #2, #3, #4, │
│ #5, #6, #7, #8, #9 │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Order By ────────────┴───────────────────────╮
│ Order By: │
│ memory.main.lineitem.l_returnflag ASC, │
│ memory.main.lineitem.l_linestatus ASC │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: │
│ __internal_compress_string_utinyint(#0), │
│ __internal_compress_string_utinyint(#1), #2, │
│ #3, #4, #5, #6, #7, #8, #9 │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: │
│ #0, #1, #2, #3, #4, #5, │
│ "/"(CAST(#6 AS DOUBLE), CAST(#10 AS DOUBLE)), │
│ "/"(CAST(#7 AS DOUBLE), CAST(#11 AS DOUBLE)), │
│ "/"(CAST(#8 AS DOUBLE), CAST(#12 AS DOUBLE)), │
│ #9 │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: │
│ __internal_decompress_string(#0), │
│ __internal_decompress_string(#1), #2, #3, #4, │
│ #5, #2, #3, #6, #7, #7, #7, #7 │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Perfect Hash Group By ───────────────────────╮
│ Groups: #0, #1 │
│ Aggregates: sum_no_overflow(#2), │
│ sum_no_overflow(#3), │
│ sum_no_overflow(#4), │
│ sum_no_overflow(#5), │
│ sum_no_overflow(#6), count_star() │
│ ~5 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: l_returnflag, l_linestatus, │
│ l_quantity, l_extendedprice, #4, │
│ #4 * (1.00 + l_tax), l_discount │
│ ~120,114 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: │
│ __internal_compress_string_utinyint(#0), │
│ __internal_compress_string_utinyint(#1), #2, │
│ #3, #4, #5, #6 │
│ ~120,114 rows │
╰───────────────────────┬───────────────────────╯
╭─ Projection ──────────┴───────────────────────╮
│ Projections: │
│ l_returnflag, l_linestatus, l_quantity, │
│ l_extendedprice, │
│ l_extendedprice * (1.00 - l_discount), l_tax, │
│ l_discount │
│ ~120,114 rows │
╰───────────────────────┬───────────────────────╯
╭─ Seq Scan ────────────┴───────────────────────╮
│ Table: memory.main.lineitem │
│ Type: Sequential Scan │
│ Projections: l_returnflag, l_linestatus, │
│ l_quantity, l_extendedprice, │
│ l_discount, l_tax │
│ Filters: │
│ l_shipdate <= '1998-09-02'::DATE │
│ ~120,114 rows │
╰───────────────────────────────────────────────╯
duckdb的版本号和python模块版本号不同。如果要下载插件,还需在python交互环境中设置http_proxy代理参数。
大约从v1.6.0-dev10000版本开始,执行计划输出使用圆角方框,显示内容和1.5.3版本大致相同,把操作名放在上框线上,更紧凑。

20

被折叠的 条评论
为什么被折叠?



