npm.io
0.34.2 • Published 2 months ago

databend-driver

Licence
Apache-2.0
Version
0.34.2
Deps
0
Size
33 kB
Vulns
0
Weekly
0
Stars
65

databend-driver

Databend Node.js Client

image License image

Usage

const { Client } = require("databend-driver");

const client = new Client(
  "databend://root:root@localhost:8000/?sslmode=disable",
);
const conn = await client.getConn();

await conn.exec(`CREATE TABLE test (
	i64 Int64,
	u64 UInt64,
	f64 Float64,
	s   String,
	s2  String,
	d   Date,
	t   DateTime
);`);

// get rows of value array
const rows = await conn.queryIter("SELECT * FROM test");
let row = await rows.next();
while (row) {
  console.log(row.values());
  row = await rows.next();
}

// get rows of map
const rows = await conn.queryIter("SELECT * FROM test");
let row = await rows.next();
while (row) {
  console.log(row.data());
  row = await rows.next();
}

// iter rows
const rows = await conn.queryIter("SELECT * FROM test");
for await (const row of rows) {
  console.log(row.values());
}

// pipe rows
import { Transform } from "node:stream";
import { finished, pipeline } from "node:stream/promises";

const rows = await conn.queryIter("SELECT * FROM test");
const stream = rows.stream();
const transformer = new Transform({
  readableObjectMode: true,
  writableObjectMode: true,
  transform(row, _, callback) {
    console.log(row.data());
  },
});
await pipeline(stream, transformer);
await finished(stream);

await conn.close();

Type Mapping

Databend Types

General Data Types
Databend Node.js
BOOLEAN Boolean
TINYINT Number
SMALLINT Number
INT Number
BIGINT BigInt
FLOAT Number
DOUBLE Number
DECIMAL String
DATE Date
TIMESTAMP Date
TIMESTAMP_TZ Date
VARCHAR String
BINARY Buffer
Semi-Structured Data Types
Databend Node.js
ARRAY Array
TUPLE Array
MAP Object
VARIANT String / Object
BITMAP String
GEOMETRY String / Buffer
GEOGRAPHY String / Buffer

Note: VARIANT is a json encoded string. Example:

CREATE TABLE example (
    data VARIANT
);
INSERT INTO example VALUES ('{"a": 1, "b": "hello"}');
const row = await conn.queryRow("SELECT * FROM example limit 1;");
const data = row.values()[0];
const value = JSON.parse(data);
console.log(value);

GEOMETRY and GEOGRAPHY follow the current geometry_output_format setting. Text formats such as GeoJSON or WKT return String; binary formats such as WKB or EWKB return Buffer.

For example:

const row = await conn.queryRow(
  "settings(geometry_output_format='WKB') SELECT st_point(60, 37)",
);
console.log(Buffer.isBuffer(row.values()[0]));

We also provide a helper function to convert VARIANT to Object:

const row = await conn.queryRow("SELECT * FROM example limit 1;");
row.setOpts({ variantAsObject: true });
console.log(row.data());

Parameter binding

const row = await this.conn.queryRow(
  "SELECT $1, $2, $3, $4",
  (params = [3, false, 4, "55"]),
);
const row = await this.conn.queryRow(
  "SELECT :a, :b, :c, :d",
  (params = { a: 3, b: false, c: 4, d: "55" }),
);
const row = await this.conn.queryRow("SELECT ?, ?, ?, ?", [3, false, 4, "55"]);

Development

cd bindings/nodejs
pnpm install
pnpm run build:debug
pnpm run test

Keywords