--- title: "Database" sidebarTitle: "Database" description: "Connect to LanceDB and configure storage, credentials and read consistency." icon: database keywords: ["connect", "database", "uri", "api key", "storage options", "consistency"] availability: oss: available enterprise: available summary: >- OSS opens tables in a local directory or object storage. Enterprise connects to remote compute with a database URI and credentials. --- import { PyConnectEnterprisePlaceholders, TsConnectEnterprisePlaceholders } from '/snippets/connection.mdx'; A database connection provides access to tables and namespaces in a [catalog](/basics/catalog). Use it to create and open tables, list catalog objects, and configure how your application reaches the data. ## Connection URIs {#uris} | URI | Offering | Where queries run | | --- | --- | --- | | `./.lancedb` | OSS, with local storage | In your application | | `s3://bucket/path`, `gs://bucket/path`, `az://container/path` | OSS, with object storage | In your application | | `db://my-database` | Enterprise | On remote compute | [Connect to LanceDB](/basics/connect) has examples for each connection type. A connection to object storage still uses the embedded library: your process reads and writes the bucket directly. Enterprise runs operations remotely and manages the supporting compute and maintenance. ## Connect to Enterprise {#deployment} Replace the placeholders with the database URI, key, region and endpoint provided by your administrator. {PyConnectEnterprisePlaceholders} { "import * as lancedb from \"@lancedb/lancedb\";\n\n" } {TsConnectEnterprisePlaceholders} | Python option | TypeScript option | Purpose | | --- | --- | --- | | `api_key` | `apiKey` | Authenticate the connection | | `region` | `region` | Select the database's region | | `host_override` | `hostOverride` | Set the Enterprise endpoint | | `client_config` | `clientConfig` | Configure retries, timeouts and connection pooling. A retry can [repeat an append](/ingestion/insert#performance). | Use your deployment's region rather than relying on the `us-east-1` default. For application code, load credentials from environment variables or a secrets manager. See [Authentication](/enterprise/authentication) for OAuth and [SQL](/basics/sql) for the separate SQL connection settings. ## Storage options {#storage-options} For OSS tables in object storage, `storage_options` configures credentials, endpoints and options for new tables. This example enables stable row IDs for tables created through the connection: ```python Python icon="python" import lancedb db = lancedb.connect( "s3://bucket/path", storage_options={"new_table_enable_stable_row_ids": "true"}, ) ``` ```typescript TypeScript icon="square-js" import * as lancedb from "@lancedb/lancedb"; const db = await lancedb.connect("s3://bucket/path", { storageOptions: { new_table_enable_stable_row_ids: "true" }, }); ``` Set stable row IDs before creating a table that needs them, such as an ordinary materialized-view source in Python SDK 0.40.0. The option does not change tables that already exist. Enterprise storage settings are managed on the server. See [Storage](/deployment/storage) for provider credentials and other options. ## Read consistency {#consistency} For OSS connections, `read_consistency_interval` controls how often reads check for table versions committed by other writers. For example, check at most once every five seconds: ```python Python icon="python" from datetime import timedelta import lancedb db = lancedb.connect( "./.lancedb", read_consistency_interval=timedelta(seconds=5) ) ``` ```typescript TypeScript icon="square-js" import * as lancedb from "@lancedb/lancedb"; const db = await lancedb.connect("./.lancedb", { readConsistencyInterval: 5 }); ``` By default, an OSS table handle does not automatically pick up another process's writes. Reopen the table, check out its latest version, or configure a consistency interval when you need those updates. A zero interval checks on every read, with the cost of a metadata check. Enterprise manages read freshness on the server. See [Consistency](/tables/consistency) for its behavior and the distinction between seeing your own writes and seeing another client's writes. ## Database operations {#operations} The connection provides methods to create, open, list and drop tables. | Operation | Python | TypeScript | | --- | --- | --- | | Create a table | `create_table` | `createTable` | | Open a table | `open_table` | `openTable` | | List tables | `table_names`, `list_tables` | `tableNames`, `listTables` | | Drop a table | `drop_table` | `dropTable` | Use the namespace and pagination options documented in [Namespaces](/management/namespace) when working outside the root namespace or listing a large catalog. [Tables](/management/table) covers table schemas, versions and lifecycle operations. Dropping a table removes its history as well as its current data. You cannot recover a dropped table through table versioning. The OSS `drop_database()` and `drop_all_tables()` operations remove all tables without a confirmation prompt. ## Async connections {#async} Python's `connect_async` returns an `AsyncConnection`. Await its operations when working in an asynchronous application: ```python import lancedb db = await lancedb.connect_async("./.lancedb") table = await db.open_table("documents") ``` TypeScript's connection and table operations already return promises. An async connection and a background job serve different purposes. Async APIs let other tasks run while your application waits for an operation. A [job](/basics/jobs) represents work that can continue on the server after the submission call returns.