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 D1PreparedStatements.
 
- An array of 
- results: Array- An array of D1Resultobjects containing the results of theD1Database::preparestatements. Each object is in the array position corresponding to the array position of the initialD1Database::preparestatement within thestatements.
- Refer to D1Resultfor 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 countproperty contains the number of executed queries.
- The durationproperty contains the duration of operation in milliseconds.- Refer to D1ExecResultfor 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 bookmarkfrom 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 additionalgetBookmarkmethod.
 
- 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 bookmarkwhich identifies the latest version of the database seen by the last query executed within the Session.
- Returns nullif 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