title | description |
---|---|
Local Development |
Build locally using SQLite, libSQL Server or Turso. |
Developers can build locally with Turso using either of the following methods:
- SQLite — local SQLite database file
- Turso CLI — managed libSQL server
- libSQL Server — self managed libSQL server
- Turso Database — remote Turso database
You can always dump your production database and use it locally for development:
turso db shell your-database .dump > dump.sql
cat dump.sql | sqlite3 local.db
You can use any of the methods below with the `local.db` file, or you can use a new file name if you prefer to create a database from scratch.
There are a few things to keep in mind when using SQLite for local development:
- Doesn't have all the features of libSQL
- Works with non-serverless based Turso SDKs
When working with an SDK, you can pass it a file:
URL to connect to a SQLite database file instead of a remote Turso database:
import { createClient } from "@libsql/client";
const client = createClient({
url: "file:local.db",
});
let client = libsql_client::Client::from_config(libsql_client::Config {
url: url::Url::parse("file:local.db").unwrap(),
auth_token: None,
})
.await
.unwrap();
package main
import (
"database/sql"
"fmt"
"os"
_ "github.com/tursodatabase/go-libsql"
)
func main() {
dbName := "file:./local.db"
db, err := sql.Open("libsql", dbName)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to open db %s", err)
os.Exit(1)
}
defer db.Close()
}
import libsql_client
client = libsql_client.create_client_sync(
url="file:local.db"
)
You don't need to provide an authToken
in development.
It's recommended to use environment variables for both url
and authToken
for a seamless developer experience.
If you're using libSQL specific features like extensions, you should use the Turso CLI:
turso dev
This will start a local libSQL server and create a database for you. You can then connect to it using the url
option in your SDK:
import { createClient } from "@libsql/client";
const client = createClient({
url: "http://127.0.0.1:8080",
});
let client = libsql_client::Client::from_config(libsql_client::Config {
url: url::Url::parse("http://127.0.0.1:8080").unwrap(),
auth_token: None,
})
.await
.unwrap();
import libsql_client
client = libsql_client.create_client_sync(
url="http://127.0.0.1:8080"
)
Changes will be lost when you stop the server.
If you want to persist changes, or use a production dump, you can pass the --db-file
flag with the name of the SQLite file:
turso dev --db-file local.db
You can build and run libSQL server (sqld
) yourself locally, or inside your own infrastructure using the source code:
If you already have a database created with Turso, you can use that same one in development by passing the url
option to your SDK.
Keep in mind that using the Turso hosted database will incur platform costs and count towards your quota. Consider using SQLite or Turso CLI for local development to avoid platform costs.
During development you can easily connect to a SQLite, libSQL, or Turso database using one of the tools below:
- Beekeeper Studio — macOS, Linux, and Windows
- Outerbase — Runs in the browser
- TablePlus — macOS, Windows, and Linux
- Dataflare — Paid (with limited free version) macOS, Windows, and Linux
- libSQL Studio - Runs in the browser
- DBeaver - macOS, Windows, and Linux