试用duckdb 1.6dev python模块

切换到虚拟环境,目前安装的是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版本大致相同,把操作名放在上框线上,更紧凑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值