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.
Methods
Section titled “Methods”prepare()
Section titled “prepare()”Prepares a query statement to be later executed.
const someVariable = `Bs Beverages`;const stmt = env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?").bind(someVariable);
Parameters
Section titled “Parameters”query
: String Required- The SQL query you wish to execute on the database.
Return values
Section titled “Return values”D1PreparedStatement
: Object- An object which only contains methods. Refer to Prepared statement methods.
Guidance
Section titled “Guidance”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.
batch()
Section titled “batch()”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)]);
Parameters
Section titled “Parameters”statements
: Array- An array of
D1PreparedStatement
s.
- An array of
Return values
Section titled “Return values”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" }]
Guidance
Section titled “Guidance”-
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);
exec()
Section titled “exec()”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"`);
Parameters
Section titled “Parameters”query
: String Required- The SQL query statement without parameter binding.
Return values
Section titled “Return values”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}
Guidance
Section titled “Guidance”- 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", },});
Parameters
Section titled “Parameters”- None.
Return values
Section titled “Return values”- None.
withSession()
Section titled “withSession()”Starts a D1 session which maintains sequential consistency among queries executed on the returned D1DatabaseSession
object.
const session = env.DB.withSession("<parameter>");
Parameters
Section titled “Parameters”-
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
Return values
Section titled “Return values”D1DatabaseSession
: Object- An object which contains the methods
prepare()
andbatch()
similar toD1Database
, along with the additionalgetBookmark
method.
- An object which contains the methods
Guidance
Section titled “Guidance”You can return the last encountered bookmark
for a given Session using session.getBookmark()
.
D1DatabaseSession
methods
Section titled “D1DatabaseSession methods”getBookmark
Section titled “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();
Parameters
Section titled “Parameters”- None
Return values
Section titled “Return values”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
prepare()
Section titled “prepare()”This method is equivalent to D1Database::prepare
.
batch()
Section titled “batch()”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