Working with Turso
Turso is an edge-hosted, distributed database based on libSQL, an open-source and open-contribution fork of SQLite. It was designed to minimize query latency for applications where queries come from anywhere in the world.
Engineers can use Atlas to manage their Turso databases using the SQLite driver by
using the libsql+ws://
(for local environments) or libsql+wss://
schemas in their connection URLs.
This guide will walk you through the process of setting up Turso and using Atlas to manage your Turso databases.
Set up Turso on your local machine
- Start by installing Turso on your machine:
curl -sSfL https://get.tur.so/install.sh | bash
- Verify that Turso is installed by running the following command:
turso --version
- Sign up for a free Turso account using this command:
The CLI launches your default browser and asks to log in with GitHub. The first time you log in, you are asked to grant the GitHub Turso app some permissions to your account. Accept this in order to continue.
turso auth signup
Create your first Turso edge-database
-
Create a new Turso database using the following command:
turso db create atlas
The Turso system will provision a new edge database for you and print something similar to this:
Created database atlas in Frankfurt, Germany (fra) in 9 seconds.
-
Next, run the following command to find the URL of your newly created database:
turso db show atlas --url
Make note of this address as we will use it in the next section.
-
Next, create an access token to use with Atlas:
turso db tokens create atlas
The CLI will print the access token to the console. Make note of this token
as we will use it in the next section as well.
Create a configuration file for Atlas
Next, create an Atlas configuration file named atlas.hcl
with the following contents:
variable "token" {
type = string
default = getenv("TURSO_TOKEN")
}
env "turso" {
url = "libsql+wss://<REPLACE WITH YOUR SUBDOMAIN>.turso.io?authToken=${var.token}"
exclude = ["_litestream*"]
}
Let's break down this configuration file:
- We define an input variable named
token
which will be used to store the Turso access token. The variable is of thestring
type and takes the value of theTURSO_TOKEN
environment variable by default. - We define an environment named
turso
which configures our interactions with our new Turso database:
- We use the
libsql+wss://
schema to connect to the Turso database. - The
url
parameter is set to the URL of the Turso database which we created earlier. - The
authToken
parameter is set to the value of thetoken
variable which we defined earlier. - The
exclude
parameter is set to exclude the_litestream*
tables which are created by the Litestream replication engine and are usually not relevant to the application.
Use Atlas to manage your Turso database
With this configuration file in place, we can now use Atlas to manage our Turso database.
Let's show some common operations we can perform with Atlas:
Declarative migrations (HCL)
We can use the atlas schema apply
command to manage the schema of our Turso database.
Start by defining a schema file named schema.hcl
with the following contents:
schema "main" {
}
table "users" {
schema = schema.main
column "id" {
type = int
}
column "name" {
type = varchar(255)
}
column "manager_id" {
type = int
}
primary_key {
columns = [
column.id
]
}
index "idx_name" {
columns = [
column.name
]
unique = true
}
foreign_key "manager_fk" {
columns = [column.manager_id]
ref_columns = [column.id]
}
}
Next, set the TURSO_TOKEN
environment variable to the value of the Turso access token
which we created earlier:
export TURSO_TOKEN=<your jwt token>
Finally, run the following command to apply the schema to the Turso database:
atlas schema apply --env turso --to file://schema.hcl
Atlas will prompt you to approve the changes before applying them to the database:
-- Planned Changes:
-- Create "users" table
CREATE TABLE `users` (`id` int NOT NULL, `name` varchar NOT NULL, `manager_id` int NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `users` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE);
-- Create index "idx_name" to table: "users"
CREATE UNIQUE INDEX `idx_name` ON `users` (`name`);
Use the arrow keys to navigate: ↓ ↑ → ←
? Are you sure?:
▸ Apply
Abort
After approving the changes, Atlas will apply the schema to the Turso database.
Inspection
We can use the atlas schema inspect
command to inspect the schema of our Turso database.
After applying the changes we mentioned above, we can run the following command to inspect
the schema of our Turso database:
atlas schema inspect --env turso
Atlas will print the schema of the Turso database:
HCL Output
table "users" {
schema = schema.main
column "id" {
null = false
type = int
}
column "name" {
null = false
type = varchar
}
column "manager_id" {
null = false
type = int
}
primary_key {
columns = [column.id]
}
foreign_key "manager_fk" {
columns = [column.manager_id]
ref_columns = [table.users.column.id]
on_update = NO_ACTION
on_delete = CASCADE
}
index "idx_name" {
unique = true
columns = [column.name]
}
}
schema "main" {
}
You can also use the --format
flag to change the output format. For example, you can use
the --format
flag to print the schema in SQL format:
atlas schema inspect --env turso --format '{{ sql . " " }}'
SQL Output
Output:
-- Create "users" table
CREATE TABLE `users` (
`id` int NOT NULL,
`name` varchar NOT NULL,
`manager_id` int NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `users` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE
);
-- Create index "idx_name" to table: "users"
CREATE UNIQUE INDEX `idx_name` ON `users` (`name`);