Skip to content

@lancedb/lancedb • Docs


@lancedb/lancedb / blob

Function: blob()

function blob(name, options): Field

Declares a lance.blob.v2 column. Uses nullable data, uri, position, and size fields for inline bytes, whole external files, and external byte ranges. Set both position and positive size for a range, or omit both for a whole file.

Existing two-field columns remain writable. Appends and merge inserts fill missing range fields with nulls for four-field targets and drop all-null range fields for two-field targets. Non-null ranges require a four-field target. Overwrite with Arrow input replaces the table's schema; row objects are converted using the current table schema.

Query results are descriptors, not payload bytes. Use Table.fetchBlobs or Table.fetchBlobFiles to read bytes. Blobs inside lists can be written and queried as descriptors, but cannot currently be fetched because a row ID does not identify a list element.

Parameters

Returns

Field

Example

import { readFile } from "node:fs/promises";
import { Field, Int64, Schema } from "apache-arrow";
import { blob, connect } from "@lancedb/lancedb";

const db = await connect("./data");
const video = await readFile("clip.mp4");
const table = await db.createTable(
  "videos",
  [{ id: 1n, video }],
  {
    schema: new Schema([
      new Field("id", new Int64()),
      blob("video"),
    ]),
  },
);

const rows = await table.query().select(["id"]).withRowId().toArray();
const rowIds = rows.map((row) => row._rowid as bigint);
const bytes = await table.fetchBlobs("video", rowIds);

const [handle] = await table.fetchBlobFiles("video", rowIds);
const size = handle!.size();
const header = await handle!.readRange(0n, size < 65536n ? size : 65536n);