Skip to main content
This quickstart uses LanceDB Embedded with a local database and works without an account or API key. LanceDB Embedded runs in your application’s process; your data can live on local disk or in object storage.

1. Install LanceDB

Choose your language. Python uses Pandas to display the search results. TypeScript needs Node.js 22.18 or later to run the .mts example directly.
Run the Rust commands in a new, empty directory. The polars feature provides DataFrame output; remote also lets this example connect to Enterprise.

Python pre-release builds

To pick up the latest features and bug fixes before the next stable release, install a pre-release from LanceDB’s Fury index.
Most applications only need lancedb. Install the optional pylance extra and include the Lance preview index only when building query engines or connectors, calling format-level lance APIs directly, converting plain-scan lazy blob handles with to_pandas(), or reading legacy v1 blob bytes into pandas with Python 0.41.0 or 0.42.0b8. Those clients use the native bytes path for supported v2 blob queries; they still need pylance for legacy pandas bytes conversion:
The LanceDB preview index contains old pylance releases; current Lance previews are published to the lance-format index. By default, uv only considers versions from the first index containing a package, which can select an old pylance or backtrack to an older LanceDB release. unsafe-best-match searches all configured indexes, like pip; use it only with indexes you trust. Install the extra rather than an unconstrained pylance so LanceDB’s minimum supported version is enforced.
Pre-release builds receive the same level of testing as stable releases, but their availability is not guaranteed for more than 6 months after release. For real-world workloads, we recommend you use the latest stable release as far as possible.

Older x86_64 CPUs

The default lancedb wheel targets x86-64-haswell (AVX2 + FMA + F16C). On older x86_64 CPUs without AVX2 (Intel Sandy Bridge, Ivy Bridge, Westmere; AMD Bulldozer, Piledriver, Steamroller), import lancedb crashes with Illegal instruction.Install lancedb-compat instead. It exposes the same API (import lancedb still works), is built at the x86-64-v2 baseline, and uses runtime SIMD dispatch to still use AVX2, FMA, or AVX-512 when available:
The two packages share the same lancedb/ namespace and conflict at install time, so pick one. To switch, uninstall the other first (pip uninstall lancedb && pip install lancedb-compat).

2. Connect to a database

Local directory

LanceDB creates an ex_lancedb directory to store your tables. No server is needed.
For Python’s async API, see Connecting to a database.

Object storage

Use an s3://, gs://, or az:// URI in place of the local path. See Object storage for credentials and provider-specific options.

Enterprise

Use the database URI, API key, and endpoint provided by your administrator or the LanceDB team. Replace the placeholders below with those details. Use the deployment’s region if provided; otherwise keep us-east-1.
In application code, load credentials from environment variables or a secrets manager. See connection settings for an example.
Need a deployment? Contact the LanceDB team. For differences between local and server execution, see LanceDB Enterprise.

3. Create a table and add data

Each row describes a frame from a robot video clip and stores an embedding alongside its video, caption, and quality stats.
These embeddings are made up for this example. In your application, use an embedding model to generate them from your data.
Create a frames table from those records:
This example uses overwrite mode so you can run it again. It replaces any existing frames table in the database you connect to. Add one more frame:
Find the two embeddings closest to the query embedding. This example uses a fixed embedding; it does not call an embedding model.
Frames 2 and 4 come back first — the gripper closing on the cup, then lowering it. Python displays a Pandas DataFrame, Rust displays a Polars DataFrame, and TypeScript displays an array of results. The _distance column measures how far each result is from your query embedding, with smaller values indicating a closer match.

5. Curate data with SQL

Step 5 needs LanceDB Enterprise: SQL is an Enterprise feature. If you’re using LanceDB Embedded, skip ahead to Flatten nested fields below.
LanceDB Enterprise accepts SQL over the same connection, for sampling, joins, and curation tasks that go beyond a single table scan. Draw a quick sample to look at the data:
See SQL for the Flight SQL client and CLI alternatives to execute_query(). Now add a near-duplicate frame — frame 5 is one video frame after frame 2, with an almost identical embedding — and build the vector index that dedupe reads:
Collapse near-duplicates into a materialized view that stays current as new frames arrive, then read it back:
Frames 2 and 5 collapse into one representative — five rows become four. Which of the two ids survives is not guaranteed to stay the same across appends, so don’t treat it as a stable identifier for the cluster. See Deduplicate near-duplicate records for duplicate_pairs, resolution strategies, and tuning distance_threshold, and Statistical Sampling for percentage samples, repeatable draws, and sampling across a join.

6. Add a derived feature

Flatten nested fields

A UDF binds to top-level columns, so flatten the fields inside stats first. This is a plain eager add_columns call, so it works the same on LanceDB Embedded and LanceDB Enterprise — step 8 needs these columns either way:
The rest of this step needs LanceDB Enterprise — Functions are an Enterprise feature. If you’re using LanceDB Embedded, skip ahead to step 7.
Register a UDF as a Function, then call it to fill a column computed from those flattened fields. This fills every existing row once, immediately:
Read it back like any other column:
refresh_column fills only rows added since the last refresh and recomputes rows whose inputs changed, leaving unchanged rows alone. Run the same refresh as a background job instead, so it doesn’t block:
See Create a Function for UDFs that call external models or services, and Computed columns for the SQL-expression form that doesn’t need a registered Function.

7. Store multimodal data

Store images, audio, or other binary data alongside vectors and metadata, in a column of raw bytes. This creates a new table from one image file — replace the path with one of your own:
See Multimodal data types for larger payloads and the Blob v2 column type, which avoids loading binary data on every scan.

8. Train on your data

Read table data into PyTorch, projecting and shuffling only the columns a training step needs:
StreamingDataset wraps a table for PyTorch training reads; columns projects before reading, so a training step touches only the columns it selects, not unused ones such as caption or embedding. It works the same way against LanceDB Embedded and LanceDB Enterprise. See PyTorch Data Loader for shuffling, transforms, resuming, and multi-worker loading, and Permutation for the lower-level row-ordering primitive it’s built on.

Where to go next

Basic table operations

Create, update, and manage your tables.

Build a RAG app

Use retrieved context in a language model application.

Indexing

Speed up queries on larger datasets.

Embedding models

Generate vectors from your own data.