Get started
This guide instructs you through:
- Creating your first database using D1, Cloudflare’s native serverless SQL database.
- Creating a schema and querying your database via the command-line.
- Connecting a Cloudflare Worker to your D1 database to query your D1 database programmatically.
To continue:
- Sign up for a Cloudflare account ↗ if you have not already.
- Install
npm
↗. - Install
Node.js
↗. Use a Node version manager like Volta ↗ or nvm ↗ to avoid permission issues and change Node.js versions. Wrangler requires a Node version of16.17.0
or later.
Create a new Worker as the means to query your database.
-
Create a new project named
d1-tutorial
by running:For setup, select the following options:
- For What would you like to start with?, choose
Hello World example
. - For Which template would you like to use?, choose
Hello World Worker
. - For Which language do you want to use?, choose
TypeScript
. - For Do you want to use git for version control?, choose
Yes
. - For Do you want to deploy your application?, choose
No
(we will be making some changes before deploying).
This creates a new
d1-tutorial
directory as illustrated below.Directoryd1-tutorial
Directorynode_modules/
- …
Directorytest/
- …
Directorysrc
- index.ts
- package-lock.json
- package.json
- testconfig.json
- vitest.config.mts
- worker-configuration.d.ts
- wrangler.toml
Your new
d1-tutorial
directory includes:- A
"Hello World"
Worker inindex.ts
. - A
wrangler.toml
configuration file.wrangler.toml
is how yourd1-tutorial
Worker accesses your D1 database.
- For What would you like to start with?, choose
A D1 database is conceptually similar to many other databases: a database may contain one or more tables, the ability to query those tables, and optional indexes. D1 uses the familiar SQL query language ↗ (as used by SQLite).
To create your first D1 database:
-
Change into the directory you just created for your Workers project:
-
Run the following
wrangler d1
command and give your database a name. In this tutorial, the database is namedprod-d1-tutorial
:
This creates a new D1 database and outputs the binding configuration needed in the next step.
You must create a binding for your Worker to connect to your D1 database. Bindings allow your Workers to access resources, like D1, on the Cloudflare developer platform. You create bindings by updating your wrangler.toml
file.
To bind your D1 database to your Worker:
-
Copy the lines obtained from step 2 from your terminal.
-
Add them to the end of your
wrangler.toml
file.Specifically:
- The value (string) you set for
binding
is the binding name, and is used to reference this database in your Worker. In this tutorial, name your bindingDB
. - The binding name must be a valid JavaScript variable name ↗. For example,
binding = "MY_DB"
orbinding = "productionDB"
would both be valid names for the binding. - Your binding is available in your Worker at
env.<BINDING_NAME>
and the D1 client API is exposed on this binding.
- The value (string) you set for
You can also bind your D1 database to a Pages Function. For more information, refer to Functions Bindings for D1.
With wrangler.toml
configured properly, set up your database. Use the example schema.sql
file below to initialize your database.
-
Copy the following code and save it as a
schema.sql
file in thed1-tutorial
Worker directory you created in step 1: -
Initialize your database to run and test locally first. Bootstrap your new D1 database by running:
-
Validate your data is in your database by running:
After you have set up your database, run an SQL query from within your Worker.
-
Navigate to your
d1-tutorial
Worker and open theindex.ts
file. Theindex.ts
file is where you configure your Worker’s interactions with D1. -
Clear the content of
index.ts
. -
Paste the following code snippet into your
index.ts
file:In the code above, you:
- Define a binding to your D1 database in your TypeScript code. This binding matches the
binding
value you set inwrangler.toml
under[[d1_databases]]
. - Query your database using
env.DB.prepare
to issue a prepared query with a placeholder (the?
in the query). - Call
bind()
to safely and securely bind a value to that placeholder. In a real application, you would allow a user to define theCompanyName
they want to list results for. Usingbind()
prevents users from executing arbitrary SQL (known as “SQL injection”) against your application and deleting or otherwise modifying your database. - Execute the query by calling
all()
to return all rows (or none, if the query returns none). - Return your query results, if any, in JSON format with
Response.json(results)
.
- Define a binding to your D1 database in your TypeScript code. This binding matches the
After configuring your Worker, you can test your project locally before you deploy globally.
While in your project directory, test your database locally.
-
Run
wrangler dev
:When you run
wrangler dev
, Wrangler provides a URL (most likelylocalhost:8787
) to review your Worker. -
Navigate to the URL.
The page displays
Call /api/beverages to see everyone who works at Bs Beverages
. -
Test your database is running successfully. Add
/api/beverages
to the provided Wrangler URL. For example,localhost:8787/api/beverages
.
If successful, the browser displays your data.
To deploy your Worker to production, you must first repeat the database bootstrapping steps after replacing the --local
flag with the --remote
flag to give your Worker data to read. This creates the database tables and imports the data into the production version of your database, running on Cloudflare’s global network.
-
Bootstrap your database with the
schema.sql
file you created in step 4: -
Validate the data is in production by running:
-
Deploy your Worker to make your project accessible on the Internet. Run:
You can now visit the URL for your newly created project to query your live database.
For example, if the URL of your new Worker is d1-tutorial.<YOUR_SUBDOMAIN>.workers.dev
, accessing https://d1-tutorial.<YOUR_SUBDOMAIN>.workers.dev/api/beverages
sends a request to your Worker that queries your live database directly.
To delete your database, run:
If you want to delete your Worker, run:
In this tutorial, you have:
- Created a D1 database
- Created a Worker to access that database
- Deployed your project globally
If you have any feature requests or notice any bugs, share your feedback directly with the Cloudflare team by joining the Cloudflare Developers community on Discord ↗.
- See supported Wrangler commands for D1.
- Learn how to use the D1 client API within your Worker.
- Explore community projects built on D1.