利用vduckdb模块在v语言中访问duckdb数据库

v语言的db模块中只有mysql、sqlite等几种,没有duckdb, 本来想让DeekSeek做的,想到这两种软件都流行不短的时间了,应该有人做了,用bing一搜果然搜到了这个vduckdb

readme中给出了详细的步骤。因为做其他开发,第一步复制duckdb动态链接库已经完成。

第二步,用v install命令不成功,报错如下:

v install rodabt.vduckdb
Scanning `rodabt.vduckdb`...
error: failed to retrieve metadata for `rodabt.vduckdb`.

查询v包管理文档,得知,v install还有另外一种写法,照此执行成功。

v install --git  https://gitclone.com/github.com/rodabt/vduckdb
Scanning `https://gitclone.com/github.com/rodabt/vduckdb`...
Installing `vduckdb`...
Installed `vduckdb` in ~/.vmodules/vduckdb .

然后复制示例程序到/par/vduck.v,把里面访问外部网站的csv文件,改为访问本地csv文件。

// example.v
import vduckdb

fn main() {

    mut vdb := vduckdb.DuckDB{}
    println('vduckdb version: ${vduckdb.version()}')
    println('duckdb version: ${vduckdb.duckdb_library_version()}')

    _ := vdb.open(':memory:')!

    //db_file := 'https://gist.githubusercontent.com/Sharanya1307/631c9f66e5709dbace46b5ed6672381e/raw/4329c1980eac3a71b881b18757a5bfabd2a95a1e/people-100.csv'
    db_file := 'foods.csv'
    mut q := "select * from '${db_file}' limit 10"
    println('\nQuery: ${q}')

    _ := vdb.query(q)!

    println('\nColumns and types: ${vdb.columns}')

    println('\n Results as table to terminal:')
    println(vdb.print_table(max_rows: 10, mode: 'box'))  // other options are: ascii and md

    q = 'select "First Name", "Sex" from \'${db_file}\' limit 5'
    println('\nData from \'${q}\' as []map[string]string:')
    _ := vdb.query(q)!
    out := vdb.get_array_as_string()
    println(out)

    first_row := vdb.get_first_row()
    println(first_row)

    println('\nManaging errors...')
    q = "invalid query..."
    vdb.query(q) or {
      eprintln(err.msg())
    }
    vdb.close()
}

因为我的so文件不在当前目录,用环境变量的方法解决

v vduck.v

./vduck
[ERROR]: No libduckdb library installed
LIBDUCKDB_DIR=/par/duck/build/src ./vduck
vduckdb version: 0.6.9
duckdb version: v1.3.0

Query: select * from 'foods.csv' limit 10

Columns and types: {'category': 'varchar', 'calories': 'bigint', 'fats_g': 'double', 'sugars_g': 'bigint'}

 Results as table to terminal:
┌────────────┬──────────┬────────┬──────────┐
│ category   │ calories │ fats_g │ sugars_g │
├────────────┼──────────┼────────┼──────────┤
│ vegetables │ 450.52        │
│ seafood    │ 1505.00        │
│ meat       │ 1005.00        │
│ fruit      │ 600.011       │
│ seafood    │ 1405.01        │
│ meat       │ 12010.01        │
│ vegetables │ 200.02        │
│ fruit      │ 300.05        │
│ seafood    │ 1305.00        │
│ fruit      │ 504.50        │
└────────────┴──────────┴────────┴──────────┘

Total rows: 10

Data from 'select "First Name", "Sex" from 'foods.csv' limit 5' as []map[string]string:
V panic: result not set (Binder Error: Referenced column "First Name" not found in FROM clause!
Candidate bindings: "calories"

LINE 1: select "First Name", "Sex" from 'foods.csv' limit 5
               ^)
v hash:
/tmp/v_0/vduck.01K28TQHAYYHN337FP60V3Z92Y.tmp.c:6518: at _v_panic: Backtrace
/tmp/v_0/vduck.01K28TQHAYYHN337FP60V3Z92Y.tmp.c:6480: by panic_result_not_set
/tmp/v_0/vduck.01K28TQHAYYHN337FP60V3Z92Y.tmp.c:13373: by main__main
/tmp/v_0/vduck.01K28TQHAYYHN337FP60V3Z92Y.tmp.c:13753: by main

前面的执行都成功,后面因为csv文件结构不同报错,正好也测试了错误处理功能
vduckdb模块还是很简明的,比自己用DeepSeek写容易,当然也可能他也知道这个模块。
vduckdb的vpm页面上有一个类同的例子,需要把第一行改为import vduckdb。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值