|
3 | 3 | * @difficulty intermediate
|
4 | 4 | * @tags cli, deploy
|
5 | 5 | * @run --allow-read --allow-write --allow-env --allow-net --allow-ffi <url>
|
6 |
| - * @resource {https://deno.land/x/duckdb} Deno DuckDB on deno.land/x |
7 | 6 | * @resource {https://duckdb.org/} DuckDB - An in-process SQL OLAP database management system
|
8 |
| - * @resource {https://github.com/suketa/ruby-duckdb?tab=readme-ov-file#pre-requisite-setup-linux} DuckDB Pre-requisite setup (Linux) |
| 7 | + * @resource {https://www.npmjs.com/package/@duckdb/node-api} npm:@duckdb/node-api |
9 | 8 | * @group Databases
|
10 | 9 | *
|
11 | 10 | * Using Deno with DuckDB, you can connect to memory or a persistent
|
12 | 11 | * database with a filename.
|
13 | 12 | */
|
14 | 13 |
|
15 |
| -import { open } from "jsr:@divy/duckdb"; |
| 14 | +import { DuckDBInstance } from "npm:@duckdb/node-api"; |
16 | 15 |
|
17 |
| -// const db = open("./example.db"); |
18 |
| -const db = open(":memory:"); |
| 16 | +// For graceful cleanup of resources |
| 17 | +using stack = new DisposableStack(); |
19 | 18 |
|
20 |
| -const connection = db.connect(); |
| 19 | +// Create an in-memory database |
| 20 | +const instance = await DuckDBInstance.create(":memory:"); |
21 | 21 |
|
22 |
| -for (const row of connection.stream("select 42 as number")) { |
23 |
| - console.debug(`Row Number: ${row.number}`); // -> { number: 42 } |
24 |
| -} |
| 22 | +// Close the instance when `stack` gets out of scope |
| 23 | +stack.defer(() => instance.closeSync()); |
25 | 24 |
|
26 |
| -const prepared = connection.prepare( |
27 |
| - "SELECT ?::INTEGER AS number, ?::VARCHAR AS text;", |
28 |
| -); |
| 25 | +// Connect to the database |
| 26 | +const connection = await instance.connect(); |
29 | 27 |
|
30 |
| -const result = prepared.query(1337, "foo"); // [{ number: 1337, text: 'foo' }] |
| 28 | +// Close the connection when `stack` gets out of scope |
| 29 | +stack.defer(() => connection.closeSync()); |
31 | 30 |
|
32 |
| -console.debug(`Number: ${result[0].number}`); |
33 |
| -console.debug(`Text: ${result[0].text}`); |
| 31 | +// Simple select query |
| 32 | +const reader = await connection.runAndReadAll("select 10, 'foo'"); |
| 33 | +const rows = reader.getRows(); |
34 | 34 |
|
35 |
| -connection.close(); |
36 |
| -db.close(); |
| 35 | +console.debug(rows); // [ [ 10, "foo" ] ] |
| 36 | + |
| 37 | +// Prepared statement |
| 38 | +const prepared = await connection.prepare("select $1, $2"); |
| 39 | +prepared.bindInteger(1, 20); |
| 40 | +prepared.bindVarchar(2, "bar"); |
| 41 | +const reader2 = await prepared.runAndReadAll(); |
| 42 | +const rows2 = reader2.getRows(); |
| 43 | + |
| 44 | +console.debug(rows2); // [ [ 20, "bar" ] ] |
0 commit comments