create_table, open_table, drop_table, and
rename_table, accept namespace input. The SDK methods expose that input in the idiom of each
language: Python uses namespace_path, Rust uses builder methods like .namespace(...), and
TypeScript uses namespacePath arguments.
In LanceDB Enterprise SQL, a namespaced table is addressed by its
schema — the namespace path joined by
$, not
by . — before the table name.Namespace hierarchy
Namespaces are generalizations of catalog specs that give platform developers a clean way to present Lance tables in the structures users expect. The diagram below shows how the hierarchy can go beyond a single level. A namespace can contain a collection of tables, and it can also contain namespaces recursively.
Namespace paths and names
A namespace path is a list of components. For example,["prod", "search"] means the search
namespace inside the prod namespace. The empty path, [], means the root namespace.
Each component is a name, not a filesystem path segment, and can’t be empty. Keep each one to
letters, numbers, underscores, hyphens, and periods, so the same identifier is usable everywhere: a
local directory namespace accepts other characters too, but other namespace implementations and
deployments can refuse them. Naming rules has the lengths and the other limits.
Directory namespaces
The simplest namespace model in LanceDB is a single root namespace, often represented by one directory. Namespaces can nest inside it, as in this hierarchy:__manifest table in the root directory, and stores each table in a directory of its own there.
As a user of LanceDB Embedded, you might never notice namespaces at first, because a plain connection
uses only the root namespace, which is implicit. Connecting to this namespace is as simple as
connecting to the namespace root:
<name>.lance.
You can also explicitly connect to a namespace using lancedb.connect_namespace(...) with the directory namespace implementation:
- For simple use cases in LanceDB Embedded, you don’t need to go too deep into namespaces.
- To integrate LanceDB with external catalogs, understand how each namespace implementation resolves table names and locations in your organization’s setup.
Remote or external catalog namespaces
The example above showed local directory-based namespaces. LanceDB also supports namespaces backed by remote object stores and external catalogs, via the REST namespace implementation. For remote object stores with central metadata or catalog services (either commercial or open source), use the REST namespace implementation. It is backed by REST routes (for examplePOST /v1/namespace/{id}/create and GET /v1/namespace/{id}/list) and server-provided table locations.
For authentication, any property prefixed with headers is forwarded as an HTTP header
(for example headers.Authorization becomes Authorization, and headers.X-API-Key becomes X-API-Key).
LanceDB Enterprise REST requests use the x-api-key header for API-key authentication. Deployments
that route multiple databases through the same endpoint can also use headers such as
x-lancedb-database or x-lancedb-database-prefix for database context.
Replace the catalog URL and credential placeholders below with your values. In
application code, load credentials from environment variables or a secrets manager.
exists routes,
so existence checks made through a direct REST namespace client fail against it.
Python remote connections created with lancedb.connect("db://...") or
lancedb.connect_async("db://...") support namespace_exists and table_exists
through the existing describe routes instead. For authentication examples in LanceDB Enterprise, visit
the Namespaces in SDKs page.
Best practices
Below, we list some best practices for working with namespaces:- For simple use cases and single, stand-alone applications, the directory-based root namespace is sufficient and requires no special configuration.
- For remote storage locations, introduce explicit namespaces when multiple teams, environments, or domains share the same catalog.
- Treat namespace paths as stable identifiers (for example
"prod/search","staging/recs"). - For maintainability reasons, avoid hard-coding object-store table paths in application code. Instead, prefer catalog identifiers + namespaces.
Table operations with namespace paths
Let’s imagine a scenario where your table management needs have evolved, and you now have the following multi-level structure to organize your tables outside the root namespace.["prod", "search"]) represents a level in the namespace hierarchy, and the table name is
specified when you create, open, list, or drop it.
The SDK methods expose the namespace path in the idiom of each language:
- Python: pass
namespace_path=["prod", "search"]to table operations. - Rust: call builder methods such as
.namespace(vec!["prod".to_string(), "search".to_string()]). - TypeScript: pass a
namespacePatharray, for exampleawait db.openTable("user", ["prod", "search"]).
Using namespaces is optional in LanceDB, and most basic use cases do not require to work with them.
An empty namespace (
[]), which is the default, means the root namespace, whose tables are stored
directly under the specified root path.Namespace management APIs
You can open/create/drop tables inside a namespace path (like["prod", "search"]).
All three SDKs expose namespace lifecycle operations directly.
In Python, use lancedb.connect_namespace(...) when calling namespace lifecycle methods such as
create_namespace, list_namespaces, describe_namespace, and drop_namespace.
In TypeScript, use lancedb.connectNamespace(...) and call createNamespace, listNamespaces,
describeNamespace, and dropNamespace on the returned Connection.
In Rust, use lancedb::connect_namespace(...) and call create_namespace, list_namespaces,
and drop_namespace.
- Create mode:
createfails if the namespace already exists,exist_okkeeps the existing namespace, andoverwritereplaces it. - Drop mode:
failreports an error when the namespace doesn’t exist, andskiptreats a missing namespace as a successful no-op. - Drop behavior:
restrictkeeps non-empty namespaces from being dropped, andcascadedrops child namespaces and tables first.
limit with the
returned page_token to page through large catalogs; pass an empty namespace path ([]) when you
want to list from the root namespace. In Python, a listing returns a response: the names are in its
namespaces or tables, and page_token is set when there is another page.
Namespaces in LanceDB Enterprise
In LanceDB Enterprise deployments, configure namespace-backed federated databases in a TOML file under your deployment’sconfig directory.
LanceDB Enterprise supports both directory-based (ns_impl = "dir") and REST-based (ns_impl = "rest") namespace implementations.
The example below shows how to configure a directory-based namespace implementation in LanceDB Enterprise.
"rest" with forwarding prefixed headers
for authentication and context propagation.
forward_header_prefixes = ["X-forward"], any incoming header starting with X-forward is forwarded to
http://<your_org>.internal.catalog.com. This is useful for auth propagation, for example sending
X-forward-authorization: Bearer xxxx.
For the LanceDB REST API itself, requests use x-api-key for API-key authentication. If your endpoint
serves more than one database, LanceDB can also use headers such as x-lancedb-database or
x-lancedb-database-prefix to route the request to the right database context.
Privileges
A namespace’sUSAGE, and the CREATE_TABLE, CREATE_VIEW,
CREATE_MATERIALIZED_VIEW, CREATE_NAMESPACE, CREATE_SECRET,
CREATE_STORAGE_INTEGRATION and CREATE_FUNCTION privileges for what it
can hold, are granted through the REST ACL API or SQL GRANT/REVOKE: