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 │ 45 │ 0.5 │ 2 │
│ seafood │ 150 │ 5.0 │ 0 │
│ meat │ 100 │ 5.0 │ 0 │
│ fruit │ 60 │ 0.0 │ 11 │
│ seafood │ 140 │ 5.0 │ 1 │
│ meat │ 120 │ 10.0 │ 1 │
│ vegetables │ 20 │ 0.0 │ 2 │
│ fruit │ 30 │ 0.0 │ 5 │
│ seafood │ 130 │ 5.0 │ 0 │
│ fruit │ 50 │ 4.5 │ 0 │
└────────────┴──────────┴────────┴──────────┘
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。

509

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



