D1 Database
To interact with your D1 database from your Worker, you need to access it through the environment bindings provided to the Worker (env
).
async fetch(request, env) { // D1 database is 'env.DB', where "DB" is the binding name from the Wrangler configuration file.}
A D1 binding has the type D1Database
, and supports a number of methods, as listed below.
Prepares a query statement to be later executed.
const someVariable = `Bs Beverages`;const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
query
: String Required- The SQL query you wish to execute on the database.
D1PreparedStatement
: Object- An object which only contains methods. Refer to Prepared statement methods.
You can use the bind
method to dynamically bind a value into the query statement, as shown below.
-
Example of a static statement without using
bind
:const stmt = db.prepare("SELECT * FROM Customers WHERE CompanyName = Alfreds Futterkiste AND CustomerId = 1") -
Example of an ordered statement using
bind
:const stmt = db.prepare("SELECT * FROM Customers WHERE CompanyName = ? AND CustomerId = ?").bind("Alfreds Futterkiste", 1);
Refer to the bind
method documentation for more information.
Sends multiple SQL statements inside a single call to the database. This can have a huge performance impact as it reduces latency from network round trips to D1. D1 operates in auto-commit. Our implementation guarantees that each statement in the list will execute and commit, sequentially, non-concurrently.
Batched statements are SQL transactions ↗. If a statement in the sequence fails, then an error is returned for that specific statement, and it aborts or rolls back the entire sequence.
To send batch statements, provide D1Database::batch
a list of prepared statements and get the results in the same order.
const companyName1 = `Bs Beverages`;const companyName2 = `Around the Horn`;const stmt = env.DB.prepare(`SELECT * FROM Customers WHERE CompanyName = ?`);const batchResult = await env.DB.batch([ stmt.bind(companyName1), stmt.bind(companyName2)]);
statements
: Array- An array of
D1PreparedStatement
s.
- An array of
results
: Array- An array of
D1Result
objects containing the results of theD1Database::prepare
statements. Each object is in the array position corresponding to the array position of the initialD1Database::prepare
statement within thestatements
. - Refer to
D1Result
for more information about this object.
- An array of
Example of return values
const companyName1 = `Bs Beverages`;const companyName2 = `Around the Horn`;const stmt = await env.DB.batch([ env.DB.prepare(`SELECT * FROM Customers WHERE CompanyName = ?`).bind(companyName1), env.DB.prepare(`SELECT * FROM Customers WHERE CompanyName = ?`).bind(companyName2)]);return Response.json(stmt)
[ { "success": true, "meta": { "served_by": "miniflare.db", "duration": 0, "changes": 0, "last_row_id": 0, "changed_db": false, "size_after": 8192, "rows_read": 4, "rows_written": 0 }, "results": [ { "CustomerId": 11, "CompanyName": "Bs Beverages", "ContactName": "Victoria Ashworth" }, { "CustomerId": 13, "CompanyName": "Bs Beverages", "ContactName": "Random Name" } ] }, { "success": true, "meta": { "served_by": "miniflare.db", "duration": 0, "changes": 0, "last_row_id": 0, "changed_db": false, "size_after": 8192, "rows_read": 4, "rows_written": 0 }, "results": [ { "CustomerId": 4, "CompanyName": "Around the Horn", "ContactName": "Thomas Hardy" } ] }]
console.log(stmt[1].results);
[ { "CustomerId": 4, "CompanyName": "Around the Horn", "ContactName": "Thomas Hardy" }]
-
You can construct batches reusing the same prepared statement:
const companyName1 = `Bs Beverages`;const companyName2 = `Around the Horn`;const stmt = env.DB.prepare(`SELECT * FROM Customers WHERE CompanyName = ?`);const batchResult = await env.DB.batch([stmt.bind(companyName1),stmt.bind(companyName2)]);return Response.json(batchResult);
Executes one or more queries directly without prepared statements or parameter bindings.
const returnValue = await env.DB.exec(`SELECT * FROM Customers WHERE CompanyName = "Bs Beverages"`);
query
: String Required- The SQL query statement without parameter binding.
D1ExecResult
: Object- The
count
property contains the number of executed queries. - The
duration
property contains the duration of operation in milliseconds.- Refer to
D1ExecResult
for more information.
- Refer to
- The
Example of return values
const returnValue = await env.DB.exec(`SELECT * FROM Customers WHERE CompanyName = "Bs Beverages"`);return Response.json(returnValue);
{ "count": 1, "duration": 1}
- If an error occurs, an exception is thrown with the query and error messages, execution stops and further statements are not executed. Refer to Errors to learn more.
- This method can have poorer performance (prepared statements can be reused in some cases) and, more importantly, is less safe.
- Only use this method for maintenance and one-shot tasks (for example, migration jobs).
- The input can be one or multiple queries separated by
\n
.
Dumps the entire D1 database to an SQLite compatible file inside an ArrayBuffer.
const dump = await db.dump();return new Response(dump, { status: 200, headers: { "Content-Type": "application/octet-stream", },});
- None.
- None.
Starts a D1 session which maintains sequential consistency among queries executed on the returned D1DatabaseSession
object.
const session = env.DB.withSession("<parameter>");
-
first-primary
: StringOptional- Directs the first query in the Session (whether read or write) to the primary database instance. Use this option if you need to start the Session with the most up-to-date data from the primary database instance.
- Subsequent queries in the Session may use read replicas.
- Subsequent queries in the Session have sequential consistency.
-
first-unconstrained
: StringOptional- Directs the first query in the Session (whether read or write) to any database instance. Use this option if you do not need to start the Session with the most up-to-date data, and wish to prioritize minimizing query latency from the very start of the Session.
- Subsequent queries in the Session have sequential consistency.
- This is the default behavior when no parameter is provided.
-
bookmark
: StringOptional- A
bookmark
from a previous D1 Session. This allows you to start a new Session from at least the providedbookmark
. - Subsequent queries in the Session have sequential consistency.
- A
D1DatabaseSession
: Object- An object which contains the methods
prepare()
andbatch()
similar toD1Database
, along with the additionalgetBookmark
method.
- An object which contains the methods
You can return the last encountered bookmark
for a given Session using session.getBookmark()
.
Retrieves the latest bookmark
from the D1 Session.
const session = env.DB.withSession("first-primary");const result = await session .prepare(`SELECT * FROM Customers WHERE CompanyName = 'Bs Beverages'`) .run()return { bookmark } = session.getBookmark();
- None
bookmark
: String | null- A
bookmark
which identifies the latest version of the database seen by the last query executed within the Session. - Returns
null
if no query is executed within a Session.
- A
This method is equivalent to D1Database::prepare
.
This method is equivalent to D1Database::batch
.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Products
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark