@tursodatabase/serverless | @libsql/client | |
|---|---|---|
| Status | Production-ready | Production-ready |
| Dependencies | Uses only fetch — zero native dependencies | Requires Node.js or /web subpath |
| Concurrent writes | Planned | Will not be supported |
| ORM support | Not yet supported | Drizzle, Prisma, and others |
@tursodatabase/serverless is the lightest option with zero native dependencies — and will be the driver to later support concurrent writes. Use @libsql/client if you need a battle-tested driver today with ORM integration.
The following runtime environments are known to be compatible:
- Node.js version 12 or later
- Deno
- CloudFlare Workers
- Netlify & Vercel Edge Functions
Installing
- @tursodatabase/serverless
- @libsql/client
Initializing
- @tursodatabase/serverless
- @libsql/client
Import For compatibility with the
connect to initialize a connection that you can use to query your database:@libsql/client API, use the compat module:If you’re using libsql locally or an sqlite file, you can ignore passing
authToken.In-Memory Databases
libSQL supports connecting to in-memory databases for cases where you don’t require persistence:Local Development
You can work locally using an SQLite file and passing the path tocreateClient:
Embedded Replicas
You can work with embedded replicas by passing your Turso Database URL tosyncUrl:
Manual Sync
Thesync() function allows you to sync manually the local database with the remote counterpart:
Periodic Sync
You can automatically sync at intervals by configuring thesyncInterval (seconds) property when instantiating a new libSQL client:
Encryption
To enable encryption on a SQLite file, pass theencryptionKey:
TypeScript
Concurrency
By default, the client performs up to20 concurrent requests. You can set this option to a higher
number to increase the concurrency limit. You can also set this option to undefined to disable concurrency
completely:
Response
Each method listed below returns aPromise<ResultSet>:
| Property | Type | Description |
|---|---|---|
rows | Array<Row> | An array of Row objects containing the row values, empty for write operations |
columns | Array<string> | An array of strings with the names of the columns in the order they appear in each Row, empty for write operations |
rowsAffected | number | The number of rows affected by a write statement, 0 otherwise |
lastInsertRowid | bigint | undefined | The ID of a newly inserted row, or undefined if there is none for the statement |
Simple query
You can pass a string or object toexecute() to invoke a SQL statement:
Placeholders
libSQL supports the use of positional and named placeholders within SQL statements:libSQL supports the same named placeholder characters as SQLite —
:, @ and $.Transaction Modes
| Mode | SQLite command | Description |
|---|---|---|
write | BEGIN IMMEDIATE | The transaction may execute statements that read and write data. Write transactions executed on a replica are forwarded to the primary instance, and can’t operate in parallel. |
read | BEGIN TRANSACTION READONLY | The transaction may only execute statements that read data (select). Read transactions can occur on replicas, and can operate in parallel with other read transactions. |
deferred | BEGIN DEFERRED | The transaction starts in read mode, then changes to write as soon as a write statement is executed. This mode change may fail if there is a write transaction currently executing on the primary. |
Batch Transactions
A batch consists of multiple SQL statements executed sequentially within an implicit transaction. The backend handles the transaction: success commits all changes, while any failure results in a full rollback with no modifications.Interactive Transactions
Interactive transactions in SQLite ensure the consistency of a series of read and write operations within a transaction’s scope. These transactions give you control over when to commit or roll back changes, isolating them from other client activity.| Method | Description |
|---|---|
execute() | Similar to execute() except within the context of the transaction |
commit() | Commits all write statements in the transaction |
rollback() | Rolls back the entire transaction |
close() | Immediately stops the transaction |
ATTACH
You can attach multiple databases to the current connection using theATTACH attachment:
Make sure to allow
ATTACH and create a token
with the permission to attach a database — learn
more