0.8.5 • Published 5 months ago
@flowblade/source-duckdb v0.8.5
@flowblade/source-duckdb
Install
yarn add @flowblade/source-duckdb @flowblade/core @duckdb/node-api
Note that at this time @duckdb/node-api is still in alpha. To install use the latest tag, ie:
@duckdb/node-api@1.3.0-alpha.21
Query the database
import { DuckdbDatasource, sql } from '@flowblade/source-duckdb';
// See setup below
import { ds } from "./config.ts";
const params = {
min: 10,
max: 99,
name: 'test',
createdAt: new Date().toISOString(),
};
type Row = { id: number; name: 'test'; createdAt: Date };
const rawSql = sql<Row>`
WITH products(productId, createdAt)
AS MATERIALIZED (
FROM RANGE(1,100) SELECT
range::INT,
TIMESTAMPTZ '2025-01-01 12:30:00.123456789+01:00'
)
SELECT productId,
${params.name} as name,
createdAt
FROM products
WHERE productId BETWEEN ${params.min}::INTEGER AND ${params.max}::INTEGER
AND createdAt < ${params.createdAt}::TIMESTAMPTZ
`;
const result = await ds.query(rawSql);
const { data, meta, error } = result;
if (data) {
// Typed as Row[]
console.log(data);
}
if (error) {
// Typed as QError
console.log(error);
}
// Optionally: map over the data to transform it
const { data: mappedData } = result.map((row) => {
return {
id: row.productId,
key: `key-${row.productId}`
}
});
Create a duckdb instance
import os from 'node:os';
import { type DuckDBConnection, DuckDBInstance } from '@duckdb/node-api';
import { DuckdbDatasource } from '@flowblade/source-duckdb';
// Create a connection to a DuckDB instance
const createConnection = async (
maxThreads = 4
): Promise<DuckDBConnection> => {
const availableThreads = os.availableParallelism();
const maxParallelism = Math.min(maxThreads, availableThreads - 1);
const threads = availableThreads > 1 ? maxParallelism : undefined;
const instance = await DuckDBInstance.create(':memory:', {
// Choose between READ_ONLY or READ_WRITE
// Note that in READ_WRITE mode concurrency is limited to 1
// See: https://duckdb.org/docs/connect/concurrency.html
access_mode: 'READ_WRITE',
max_memory: '64MB',
// Using more threads may require additional memory
...(threads ? { threads: threads.toString(10) } : {}),
});
return await instance.connect();
};
const duckdb = await createConnection();
// Create a duckdb datasource
export const ds = new DuckdbDatasource({ connection: duckdb });
Compatibility
Level | CI | Description |
---|---|---|
Node | ✅ | CI for 18.x, 20.x & 22.x. |
Cloudflare | ✅ | Ensured with @cloudflare/vitest-pool-workers (see wrangler.toml |
Browserslist | ✅ | > 95% on 01/2025. Chrome 96+, Firefox 90+, Edge 19+, ios 15+, Safari 15+ and Opera 77+ |
Typescript | ✅ | TS 5.0 + / are-the-type-wrong checks on CI. |
ES2022 | ✅ | Dist files checked with es-check |
Performance | ✅ | Monitored with codspeed.io |
Contributors
Contributions are welcome. Have a look to the CONTRIBUTING document.
Sponsors
Sponsor, coffee, or star – All is spent for quality time with loved ones. Thanks ! 🙏❤️
Special thanks to
License
MIT © Sébastien Vanvelthem and contributors.
0.8.5
5 months ago
0.8.4
5 months ago
0.8.3
5 months ago
0.8.2
5 months ago
0.8.1
5 months ago
0.8.0
5 months ago
0.7.2
5 months ago
0.7.1
5 months ago
0.7.0
7 months ago
0.6.0
7 months ago
0.5.0
8 months ago
0.4.0
8 months ago
0.3.2
8 months ago
0.3.1
8 months ago
0.3.0
8 months ago
0.2.1
9 months ago
0.2.0
9 months ago
0.1.13
9 months ago
0.1.12
9 months ago
0.1.11
9 months ago
0.1.10
9 months ago
0.1.9
9 months ago
0.1.8
9 months ago
0.1.7
9 months ago
0.1.6
9 months ago
0.1.5
9 months ago
0.1.4
10 months ago
0.1.3
10 months ago
0.1.2
10 months ago
0.1.1
10 months ago
1.0.0
10 months ago