mirror of
https://github.com/lancedb/lancedb.git
synced 2026-11-03 09:16:52 +00:00
A view is a named query a database stores and plans on every read. It
holds no rows, which is the whole difference from a materialized view.
## API
| Verb | Route |
| --- | --- |
| `create_view(name, query, namespace_path)` | `POST
/v1/view/{id}/create` |
| `describe_view(name, namespace_path)` | `POST /v1/view/{id}/describe`
|
| `drop_view(name, namespace_path)` | `POST /v1/view/{id}/drop` |
| `list_views(namespace_path)` | `GET /v1/namespace/{id}/view/list` |
On `Connection` and the `Database` trait, with the remote client, Python
(sync and async) and Node bindings. Local databases return
`NotSupported`: the server side is Sophon's, where a view is an object
of the database manifest.
`ViewDescription` carries the defining query, the database *and
namespace path* unqualified names in it resolve against, and the schema
the query resolved to. `create_view` returns one, so a caller has the
schema without a second call.
Both defaults travel with the view because it outlives the session that
declared it: the server re-plans the stored query on every read, so a
reader resolving an unqualified name against its own defaults would read
a different table. `default_namespace_path` crosses the wire as
`default_namespace`, a path like `namespace`, absent for the root.
There is no replace: a name already taken is an error, and changing a
view is a drop followed by a create, each authorized against what it
actually touches.
Querying a view stays SQL's job. There are no rows behind a view, so
there is no `open_view` returning a `Table`.
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright The LanceDB Authors
|
|
|
|
"""Views: a named query a database stores and plans on every read.
|
|
|
|
A view holds no rows. What it stores is the statement that defines it and the
|
|
schema that statement resolved to, so a reader sees the sources as they are
|
|
now. See ``DBConnection.create_view``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import TYPE_CHECKING, List
|
|
|
|
if TYPE_CHECKING:
|
|
import pyarrow as pa
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ViewDescription:
|
|
"""What a database records about one view."""
|
|
|
|
name: str
|
|
"""The view's name within its namespace."""
|
|
query: str
|
|
"""The defining query, as the database stores it."""
|
|
default_database: str
|
|
"""The database that unqualified table names in ``query`` resolve against."""
|
|
schema: "pa.Schema"
|
|
"""The schema the defining query resolved to when the view was created."""
|
|
namespace_path: List[str] = field(default_factory=list)
|
|
"""The namespace holding the view; empty is the root namespace."""
|
|
default_namespace_path: List[str] = field(default_factory=list)
|
|
"""The namespace path those unqualified names resolve against.
|
|
|
|
Recorded with the view because it outlives the session that declared it: a
|
|
reader resolving the query against its own default namespace could read a
|
|
different table than the view was defined over.
|
|
"""
|