Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions docs/namespaces.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,24 @@ See the Python example below for how to use namespaces in practice.
```python Python icon="python"
import lancedb

# App config: only the catalog endpoint/root is configured once.
db = lancedb.connect("s3://my-lakehouse/catalog")
# Local namespace-backed catalog root (DirectoryNamespace)
db = lancedb.connect_namespace("dir", {"root": "./namespace_test"})

# Business identifier + namespace path (stable app-level IDs)
namespace = ["prod", "recommendations"]
table_name = "user_profiles"

# Create namespace hierarchy sequentially
for i in range(1, len(namespace) + 1):
db.create_namespace(namespace[:i], mode="exist_ok")

# Good: resolve table through catalog + namespace
table = db.open_table(table_name, namespace=namespace)
table = db.create_table(
table_name,
data=[{"id": 1, "vector": [0.1, 0.2], "name": "alice"}],
namespace=namespace,
mode="overwrite",
)

# Bad: Avoid hard-coded physical object-store table paths
# (it's bad for maintainability reasons)
Expand Down
4 changes: 2 additions & 2 deletions docs/snippets/connection.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ export const PyConnectObjectStorage = "import lancedb\n\nuri = \"s3://your-bucke

export const PyConnectObjectStorageAsync = "import lancedb\n\nuri = \"s3://your-bucket/path\"\n# You can also use \"gs://your-bucket/path\" or \"az://your-container/path\".\nasync_db = await lancedb.connect_async(uri)\n";

export const PyNamespaceAdminOps = "import lancedb\n\ndb = lancedb.connect(\"./data/sample-lancedb\")\ndb.create_namespace([\"prod\"])\ndb.create_namespace([\"prod\", \"search\"])\n\nchild_namespaces = db.list_namespaces(namespace=[\"prod\"]).namespaces\nmetadata = db.describe_namespace([\"prod\", \"search\"])\n\ndb.drop_namespace([\"prod\", \"search\"], mode=\"skip\")\ndb.drop_namespace([\"prod\"], mode=\"skip\")\n";
export const PyNamespaceAdminOps = "import lancedb\n\ndb = lancedb.connect_namespace(\"dir\", {\"root\": \"./data/sample-lancedb\"})\nnamespace = [\"prod\", \"search\"]\n\nfor i in range(1, len(namespace) + 1):\n db.create_namespace(namespace[:i], mode=\"exist_ok\")\n\nchild_namespaces = db.list_namespaces(namespace=[\"prod\"]).namespaces\nmetadata = db.describe_namespace([\"prod\", \"search\"])\n\ndb.drop_namespace([\"prod\", \"search\"], mode=\"skip\")\ndb.drop_namespace([\"prod\"], mode=\"skip\")\n";

export const PyNamespaceTableOps = "import lancedb\n\ndb = lancedb.connect(\"./data/sample-lancedb\")\nnamespace = [\"prod\", \"search\"]\n\ndb.create_table(\n \"users\",\n data=[{\"id\": 1, \"name\": \"alice\"}],\n mode=\"overwrite\",\n namespace=namespace,\n)\n\ntable = db.open_table(\"users\", namespace=namespace)\ntables = db.list_tables(namespace=namespace).tables\n\ndb.drop_table(\"users\", namespace=namespace)\n# drop_all_tables is namespace-aware as well:\n# db.drop_all_tables(namespace=namespace)\n";
export const PyNamespaceTableOps = "import lancedb\n\ndb = lancedb.connect_namespace(\"dir\", {\"root\": \"./data/sample-lancedb\"})\nnamespace = [\"prod\", \"search\"]\n\nfor i in range(1, len(namespace) + 1):\n db.create_namespace(namespace[:i], mode=\"exist_ok\")\n\ndb.create_table(\n \"users\",\n data=[{\"id\": 1, \"vector\": [0.1, 0.2], \"name\": \"alice\"}],\n mode=\"overwrite\",\n namespace=namespace,\n)\n\ntable = db.open_table(\"users\", namespace=namespace)\ntables = db.list_tables(namespace=namespace).tables\n\ndb.drop_table(\"users\", namespace=namespace)\n# drop_all_tables is namespace-aware as well:\n# db.drop_all_tables(namespace=namespace)\n";

export const TsConnect = "import * as lancedb from \"@lancedb/lancedb\";\n\nasync function connectExample(uri: string) {\n const db = await lancedb.connect(uri);\n return db;\n}\n";

Expand Down
2 changes: 2 additions & 0 deletions docs/tables/namespaces.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ the `data/` directory.

You can open/create/drop tables inside a namespace path (like `["prod", "search"]`).
The Python and Rust 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`.

<CodeGroup>
<CodeBlock filename="Python" language="Python" icon="python">
Expand Down
15 changes: 10 additions & 5 deletions tests/py/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,15 @@ def namespace_table_ops_example():
# --8<-- [start:namespace_table_ops]
import lancedb

db = lancedb.connect("./data/sample-lancedb")
db = lancedb.connect_namespace("dir", {"root": "./data/sample-lancedb"})
namespace = ["prod", "search"]

for i in range(1, len(namespace) + 1):
db.create_namespace(namespace[:i], mode="exist_ok")

db.create_table(
"users",
data=[{"id": 1, "name": "alice"}],
data=[{"id": 1, "vector": [0.1, 0.2], "name": "alice"}],
mode="overwrite",
namespace=namespace,
)
Expand All @@ -82,9 +85,11 @@ def namespace_admin_ops_example():
# --8<-- [start:namespace_admin_ops]
import lancedb

db = lancedb.connect("./data/sample-lancedb")
db.create_namespace(["prod"])
db.create_namespace(["prod", "search"])
db = lancedb.connect_namespace("dir", {"root": "./data/sample-lancedb"})
namespace = ["prod", "search"]

for i in range(1, len(namespace) + 1):
db.create_namespace(namespace[:i], mode="exist_ok")

child_namespaces = db.list_namespaces(namespace=["prod"]).namespaces
metadata = db.describe_namespace(["prod", "search"])
Expand Down
Loading