mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-13 15:22:30 +00:00
The Enterprise connection examples now read the database URI from LANCEDB_URI and the endpoint from LANCEDB_HOST_OVERRIDE, with the API key and region beside them, the convention the rest of the site uses. Without an endpoint they stop rather than fall back to one. Their tests check both. The REST API reference used LANCEDB_URI for the HTTP endpoint and listed and created tables at routes the server does not serve. It now uses LANCEDB_HOST_OVERRIDE, lists tables at /v1/table/, creates `words` from an Arrow IPC stream, and describes it to confirm the write.
144 lines
4.7 KiB
TypeScript
144 lines
4.7 KiB
TypeScript
// SPDX-License-Identifier: Apache-2.0
|
|
// SPDX-FileCopyrightText: Copyright The LanceDB Authors
|
|
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
import * as path from "node:path";
|
|
import { withTempDirectory } from "./util.ts";
|
|
// --8<-- [start:connect]
|
|
import * as lancedb from "@lancedb/lancedb";
|
|
|
|
async function connectExample(uri: string) {
|
|
const db = await lancedb.connect(uri);
|
|
return db;
|
|
}
|
|
// --8<-- [end:connect]
|
|
|
|
test("connect to a local database", async () => {
|
|
await withTempDirectory(async (tempDir) => {
|
|
const uri = path.join(tempDir, "ex_lancedb");
|
|
const db = await connectExample(uri);
|
|
expect(db).toBeDefined();
|
|
});
|
|
});
|
|
|
|
async function connectEnterpriseQuickstart() {
|
|
// --8<-- [start:connect_enterprise_quickstart]
|
|
const setting = (name: string) => {
|
|
const value = process.env[name];
|
|
if (!value) throw new Error(`Set ${name}`);
|
|
return value;
|
|
};
|
|
|
|
const db = await lancedb.connect(setting("LANCEDB_URI"), {
|
|
apiKey: setting("LANCEDB_API_KEY"),
|
|
region: process.env.LANCEDB_REGION ?? "us-east-1",
|
|
hostOverride: setting("LANCEDB_HOST_OVERRIDE"),
|
|
});
|
|
// --8<-- [end:connect_enterprise_quickstart]
|
|
return db;
|
|
}
|
|
|
|
describe("enterprise quickstart connect", () => {
|
|
const saved = { ...process.env };
|
|
afterEach(() => {
|
|
process.env = { ...saved };
|
|
});
|
|
|
|
test("reads the connection from the environment", async () => {
|
|
const mockDb = { __mock: true } as unknown as Awaited<
|
|
ReturnType<typeof lancedb.connect>
|
|
>;
|
|
const spy = jest.spyOn(lancedb, "connect").mockResolvedValue(mockDb);
|
|
process.env.LANCEDB_URI = "db://your-database";
|
|
process.env.LANCEDB_API_KEY = "your-api-key";
|
|
delete process.env.LANCEDB_REGION;
|
|
process.env.LANCEDB_HOST_OVERRIDE = "https://your-endpoint";
|
|
|
|
const db = await connectEnterpriseQuickstart();
|
|
expect(db).toBe(mockDb);
|
|
expect(spy).toHaveBeenCalledWith("db://your-database", {
|
|
apiKey: "your-api-key",
|
|
region: "us-east-1",
|
|
hostOverride: "https://your-endpoint",
|
|
});
|
|
spy.mockRestore();
|
|
});
|
|
|
|
test("requires an endpoint", async () => {
|
|
process.env.LANCEDB_URI = "db://your-database";
|
|
process.env.LANCEDB_API_KEY = "your-api-key";
|
|
delete process.env.LANCEDB_HOST_OVERRIDE;
|
|
|
|
await expect(connectEnterpriseQuickstart()).rejects.toThrow(
|
|
"Set LANCEDB_HOST_OVERRIDE",
|
|
);
|
|
});
|
|
});
|
|
|
|
// --8<-- [start:connect_object_storage]
|
|
async function connectObjectStorageExample() {
|
|
const uri = "s3://your-bucket/path";
|
|
// You can also use "gs://your-bucket/path" or "az://your-container/path".
|
|
const db = await lancedb.connect(uri);
|
|
return db;
|
|
}
|
|
// --8<-- [end:connect_object_storage]
|
|
|
|
async function namespaceTableOpsExample() {
|
|
// --8<-- [start:namespace_table_ops]
|
|
const db = await lancedb.connectNamespace("dir", { root: "./local_lancedb" });
|
|
|
|
// Create namespace tree: prod/search and prod/recommendations
|
|
await db.createNamespace(["prod"], { mode: "exist_ok" });
|
|
await db.createNamespace(["prod", "search"], { mode: "exist_ok" });
|
|
await db.createNamespace(["prod", "recommendations"], { mode: "exist_ok" });
|
|
|
|
await db.createTable(
|
|
"user",
|
|
[{ id: 1, vector: [0.1, 0.2], name: "alice" }],
|
|
["prod", "search"],
|
|
{ mode: "create" }, // use "overwrite" only if you want to replace existing table
|
|
);
|
|
|
|
await db.createTable(
|
|
"user",
|
|
[{ id: 2, vector: [0.3, 0.4], name: "bob" }],
|
|
["prod", "recommendations"],
|
|
{ mode: "create" },
|
|
);
|
|
|
|
// Verify
|
|
console.log((await db.listNamespaces()).namespaces); // ["prod"]
|
|
console.log((await db.listNamespaces(["prod"])).namespaces); // ["recommendations", "search"]
|
|
console.log(await db.tableNames(["prod", "search"])); // ["user"]
|
|
console.log(await db.tableNames(["prod", "recommendations"])); // ["user"]
|
|
// --8<-- [end:namespace_table_ops]
|
|
}
|
|
|
|
async function namespaceAdminOpsExample() {
|
|
// --8<-- [start:namespace_admin_ops]
|
|
const db = await lancedb.connectNamespace("dir", { root: "./local_lancedb" });
|
|
const namespace = ["prod", "search"];
|
|
|
|
await db.createNamespace(["prod"]);
|
|
await db.createNamespace(["prod", "search"]);
|
|
|
|
const childNamespaces = (await db.listNamespaces(["prod"])).namespaces;
|
|
console.log(`Child namespaces under ${JSON.stringify(namespace)}:`, childNamespaces);
|
|
// Child namespaces under ["prod","search"]: [ 'search' ]
|
|
|
|
const metadata = await db.describeNamespace(["prod", "search"]);
|
|
console.log(`Metadata for namespace ${JSON.stringify(namespace)}:`, metadata);
|
|
|
|
await db.dropNamespace(["prod", "search"], { mode: "skip" });
|
|
await db.dropNamespace(["prod"], { mode: "skip" });
|
|
// --8<-- [end:namespace_admin_ops]
|
|
return { childNamespaces, metadata };
|
|
}
|
|
|
|
void [
|
|
connectObjectStorageExample,
|
|
connectEnterpriseQuickstart,
|
|
namespaceTableOpsExample,
|
|
namespaceAdminOpsExample,
|
|
];
|