I was interested to learn more about the developer experience of Cloudflare’s D1 serverless SQL database offering.
I started with this tutorial.
Using wrangler
you can scaffold a Worker and create a D1 database.
The docs were straightforward up until the Write queries within your
Worker section.
For me, wrangler
scaffolded a worker with a different structure than the docs discuss.
I was able to progress through the rest of the tutorial by doing the following:
Add the following to worker-configuration.d.ts
:
export interface Env {
DB D1Database;
}
Modify worker.ts
to make the SQL query:
...
if (url.pathname.startsWith('/api/')) {
if (url.pathname === "/api/beverages") {
const { results } = await env.DB.prepare(
"SELECT * FROM Customers WHERE CompanyName = ?"
)
.bind("Bs Beverages")
.all();
return Response.json(results);
}
return apiRouter.handle(request);
}
...
Run
wrangler dev --local
wrangler dev --local --persist
yields an error for my version of wrangler
:
โฏ wrangler version
โ
๏ธ wrangler 3.1.0
Validate the worker queries the database:
โฏ curl http://127.0.0.1:8787/api/beverages | jq .
[
{
"CustomerId": 11,
"CompanyName": "Bs Beverages",
"ContactName": "Victoria Ashworth"
},
{
"CustomerId": 13,
"CompanyName": "Bs Beverages",
"ContactName": "Random Name"
}
]
I ran npm run deploy
to start a Cloudflare working in production.
The CLI outputted a URL when my worker was up and running.
I tried curl
ing the API route that accesses the database, but unfortunately got an error (“Error 1101”).
I started streaming realtime logs from the Cloudflare dashboards for the working, the hit the same route again.
The logs registered the exception but I wasn’t able to find much additional information:
{
"exceptions": [
{
"name": "Error",
"message": "D1_ERROR",
"timestamp": 1687098711996
}
],
...
}
Overall, it was easy to get things working locally and in production (for the worker at least).
It’s not clear if D1 can be easily used outside the Cloudflare serverless ecosystem – for example, I’m not sure if I could connect to a D1 database from a Python app.
Currently, D1 seems dependent on Cloudflare’s tooling and serverless platform.
I stopped once I got stuck on the D1_ERROR
.