1 个不稳定发布

0.2.1-alpha.102023年6月10日

#2708 in 数据库接口

MIT/Apache

160KB
1.5K SLoC

Rust 873 SLoC // 0.0% comments JavaScript 150 SLoC Shell 119 SLoC // 0.2% comments Python 76 SLoC // 0.1% comments TypeScript 59 SLoC // 0.2% comments Ruby 13 SLoC SQL 8 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 PyPI
Node.js npm install sqlite-xsv npm
Deno deno.land/x/sqlite_xsv deno.land/x release
Ruby gem install sqlite-xsv Gem
GitHub发布 GitHub tag (latest SemVer pre-release)

发布页面包含了Linux amd64、MacOS amd64(暂无arm版本)和Windows的预构建二进制文件。

作为可加载的扩展

如果您想将sqlite-xsv作为运行时加载的扩展使用,请从发布中下载xsv0.dylib(适用于MacOS)、xsv0.so(Linux)或xsv0.dll(Windows)文件,并将其加载到您的SQLite环境中。

注意:文件名中的0xsv0.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