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.
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