1 个不稳定发布
0.2.1-alpha.10 | 2023年6月10日 |
---|
#2708 in 数据库接口
160KB
1.5K SLoC
sqlite-xsv
这是一个用Rust编写的快速且高效的SQLite扩展,用于处理CSV文件!基于sqlite-loadable-rs
和出色的csv crate。
- 将CSV、TSV和其他SV查询作为SQLite虚拟表
- "reader"接口允许您从其他数据源(如
sqlite-http
)查询CSV文件 - 内置支持查询使用gzip或zstd压缩的CSV文件
有关更多信息,请参阅sqlite-xsv介绍:SQLite最快CSV解析器(2023年1月)!
注意 这与xsv无关,但基于相同的csv crate。这个名称是
sqlite-xsv
,以区分官方的SQLite CSV虚拟表和sqlean
vsv扩展。
使用方法
.load ./xsv0
create virtual table temp.students using csv(
filename="students.csv"
);
select * from temp.students;
/*
┌────┬───────┬─────┬─────────┐
│ id │ name │ age │ process │
├────┼───────┼─────┼─────────┤
│ 1 │ alex │ 10 │ .9 │
│ 2 │ brian │ 20 │ .7 │
│ 3 │ craig │ 30 │ .3 │
└────┴───────┴─────┴─────────┘
*/
为缺少标题的CSV文件提供模式,或为列提供类型。
create virtual table temp.students_no_header using csv(
filename="students_no_header.csv",
header=false,
id text,
name text,
age int,
);
select * from temp.students_no_header;
直接查询gzip或使用zstd
压缩的文件。
create virtual table temp.students_gz using csv(
filename="students.csv.gz"
);
select * from temp.students_gz;
create virtual table temp.students_zst using csv(
filename="students.csv.zst"
);
select * from temp.students_zst;
使用csv_reader
API和SQLite CLI中的fsdir()
函数在单个查询中读取多个CSV文件。
create virtual table temp.students_reader using csv_reader(
id integer,
name text,
age integer,
progess real
);
with files as (
select name as path
from fsdir('tests/data/student_files')
)
select
files.path,
students.*
from files
join students_reader(files.path) as students
where files.path like '%.csv';
/*
┌────────────────────────────────┬────┬───────────┬─────┬─────────┐
│ path │ id │ name │ age │ progess │
├────────────────────────────────┼────┼───────────┼─────┼─────────┤
│ tests/data/student_files/a.csv │ 1 │ alex │ 10 │ 0.9 │
│ tests/data/student_files/a.csv │ 2 │ adrian │ 20 │ 0.8 │
│ tests/data/student_files/a.csv │ 3 │ andres │ 30 │ 0.7 │
│ tests/data/student_files/c.csv │ 1 │ craig │ 70 │ 0.4 │
│ tests/data/student_files/c.csv │ 2 │ catherine │ 90 │ 0.5 │
│ tests/data/student_files/c.csv │ 3 │ coin │ 80 │ 0.6 │
│ tests/data/student_files/b.csv │ 1 │ brian │ 60 │ 0.1 │
│ tests/data/student_files/b.csv │ 2 │ beto │ 50 │ 0.2 │
│ tests/data/student_files/b.csv │ 3 │ brandy │ 40 │ 0.3 │
└────────────────────────────────┴────┴───────────┴─────┴─────────┘
*/
使用reader API和sqlite-http
从HTTP端点查询CSV文件。注意:目前仅适用于内存中运行的CSV文件。
.load ./http0
-- Reading a CSV from the wonderful LA Times COVID project
-- https://github.com/datadesk/california-coronavirus-data
create virtual table temp.cdph_age_reader using csv_reader(
date,
age text,
confirmed_cases_total int,
confirmed_cases_percent float,
deaths_total int,
deaths_percent float
);
create table cdph_age as
select *
from temp.cdph_age_reader(
http_get_body(
'https://raw.githubusercontent.com/datadesk/california-coronavirus-data/master/cdph-age.csv'
)
);
select *
from cdph_age
limit 5;
/*
┌────────────┬───────┬───────────────────────┬─────────────────────────┬──────────────┬────────────────┐
│ date │ age │ confirmed_cases_total │ confirmed_cases_percent │ deaths_total │ deaths_percent │
├────────────┼───────┼───────────────────────┼─────────────────────────┼──────────────┼────────────────┤
│ 2023-01-03 │ 0-4 │ 371691 │ 0.034 │ 32 │ 0.0 │
│ 2023-01-03 │ 80+ │ 292252 │ 0.027 │ 37038 │ 0.378 │
│ 2023-01-03 │ 18–34 │ 3416056 │ 0.312 │ 1655 │ 0.017 │
│ 2023-01-03 │ 35–49 │ 2530259 │ 0.231 │ 6135 │ 0.063 │
│ 2023-01-03 │ 50–59 │ 1379087 │ 0.126 │ 10892 │ 0.111 │
└────────────┴───────┴───────────────────────┴─────────────────────────┴──────────────┴────────────────┘
*/
文档
请参阅docs.md
以获取完整的API参考。
安装
语言 | 安装 | |
---|---|---|
Python | pip install sqlite-xsv |
|
Node.js | npm install sqlite-xsv |
|
Deno | deno.land/x/sqlite_xsv |
|
Ruby | gem install sqlite-xsv |
|
GitHub发布 |
发布页面包含了Linux amd64、MacOS amd64(暂无arm版本)和Windows的预构建二进制文件。
作为可加载的扩展
如果您想将sqlite-xsv
作为运行时加载的扩展使用,请从发布中下载xsv0.dylib
(适用于MacOS)、xsv0.so
(Linux)或xsv0.dll
(Windows)文件,并将其加载到您的SQLite环境中。
注意:文件名中的
0
(xsv0.dylib
/xsv0.so
/xsv0.dll
)表示sqlite-xsv
的主版本。目前sqlite-xsv
是预v1版本,因此预计未来版本会有破坏性的更改。
例如,如果您正在使用SQLite CLI,可以像这样加载库
.load ./xsv0
select xsv_version();
-- v0.0.1
或者在Python中使用内置的sqlite3模块
import sqlite3
con = sqlite3.connect(":memory:")
con.enable_load_extension(True)
con.load_extension("./xsv0")
print(con.execute("select xsv_version()").fetchone())
# ('v0.0.1',)
或者在Node.js中使用better-sqlite3
const Database = require("better-sqlite3");
const db = new Database(":memory:");
db.loadExtension("./xsv0");
console.log(db.prepare("select xsv_version()").get());
// { 'xsv_version()': 'v0.0.1' }
对于Datasette,目前不推荐在公开的Datasette实例中加载sqlite-xsv
。这是因为SQL API会从文件系统中读取文件,这在Datasette实例上是不安全的。这可能在`sqlite-xsv`的未来版本中改变。
依赖关系
~11–15MB
~270K SLoC