{"_id":"@cloudflare/d1","_rev":"8-3df9b14a8b54fc3d32c17df28bf692ed","name":"@cloudflare/d1","dist-tags":{"latest":"1.4.1"},"versions":{"1.1.0":{"name":"@cloudflare/d1","version":"1.1.0","author":"","license":"ISC","_id":"@cloudflare/d1@1.1.0","maintainers":[{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"xtuc","email":"npm@sauleau.com"},{"name":"cf-ci-write","email":"npm-readonly@cloudflare.com"},{"name":"cf-ci2","email":"npm-readonly2@cloudflare.com"},{"name":"worenga","email":"benedikt@cloudflare.com"}],"dist":{"shasum":"bf851e8a3e4b942e15e16c5a4571e519c05fa7e8","tarball":"https://registry.npmjs.org/@cloudflare/d1/-/d1-1.1.0.tgz","fileCount":5,"integrity":"sha512-UW0RP5zJAXw0w74/FgWgX8Vs17yja97wvP5JescitPidHzkOia+gup4gtXHIGDfeJw5gx4Sx1HGd8jBUCJZj4w==","signatures":[{"sig":"MEUCIQCK3PYAIuwUXlxAeO6vdK8Ei5r72v/QQGUrj3q4dgEtSwIgEnTJAKhLEODpIeDCk8r5AD6TzBiFayaGFgJqbR1JrVI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":7856,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijNEgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKzhAAjWKvtGj4pOSuP8mjZzbPoT0es3MaVJDdcKi+26E/G/29L2sw\r\ncOdkQySO1rG9E4bDAFE0j1r29dDHP6x4ZyL35gWuGwQwI3R3kYAmAQ0lfzl3\r\nqbAX2Bf4TKTeIzyqiUmpCkG/yGClUzw2hxmKhz2VDc5n9ClPPPrqAeXJue/7\r\nwO0g1NBH1Xu8me4Wuidc7H3karq+mcfp0/UVLMrRWnCRJyCR8yrjT0jEIYuI\r\nvfA/r7WW6z0aZ1d03TgK10OtoHorZBCr6V+EVelx4b3bc6oWMQ1Zg0KtJb6g\r\nr6Ai+GvMr+vFcL61/gIB8ssF0yuFhSPq4eiR0xlMLt8FSCg1+/P+anrnkS/l\r\nMtBW5DyUzxXCiqjSZR5obDtwhdan3OcwGMavK5WmV8X4jBdlDYrtWi54EH0J\r\nGUeGNmmTmpg2P5n0q7zmuJeBAGX6GwPceS4HTOVnApIYJSZj5PPk7Qv4X7md\r\nidnWNyW//LFvBis2dLZPGH06zjbhAfOrKy0okwBzv562Nomuz6Qe41186pgS\r\n7Y6jySzHQdfDOMP2DK74p41KZDIZXfgfc+SyuuN/iqLuB28eZ7ZMQH7x3YXX\r\nZImACUF+/mM9hfk2RlmbIJX77LrUZvFGcngw/B92hnIAutB0FbaPCz51gPv+\r\noDi+UWAYAls4/PZrNzpYjWY37JrLROpOHmc=\r\n=YTiE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"src/index.ts","gitHead":"cdeb0a6dce8d28607ca35f76ba6c8f108beafe72","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc --project tsconfig.json"},"_npmUser":{"name":"xtuc","email":"npm@sauleau.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"8.1.0","description":"Temporary lib that implements the binding.query() D1 API. In the future the Workers runtime will support this natively.","directories":{},"_nodeVersion":"16.13.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.6.4"},"_npmOperationalInternal":{"tmp":"tmp/d1_1.1.0_1653395744028_0.2134829301322949","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@cloudflare/d1","version":"1.2.0","author":"","license":"ISC","_id":"@cloudflare/d1@1.2.0","maintainers":[{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"xtuc","email":"npm@sauleau.com"},{"name":"cf-ci-write","email":"npm-readonly@cloudflare.com"},{"name":"cf-ci2","email":"npm-readonly2@cloudflare.com"},{"name":"worenga","email":"benedikt@cloudflare.com"}],"dist":{"shasum":"5217c60c64cbe0cf3508da6e13eb623a41da3f5e","tarball":"https://registry.npmjs.org/@cloudflare/d1/-/d1-1.2.0.tgz","fileCount":5,"integrity":"sha512-sOiuwd15J755YMod2Ew5RBpWRf30GkJZNezMwD9Tw1N+wf30wOYDxLqcQ9OfrVsF1T93Kd8twXqu/ck7qlNqTA==","signatures":[{"sig":"MEUCIQD0FUVXfuO8EIxe9rnrJQ0c+K4pDt45M4R+xswnT+IIBwIgc0vtTa7AdInCAeV1DheP+yOdyVpQAbWFJoBEBUQm3t8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijNnhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr43g/+K1dXLihPf1+E04UfTEudugY8pl2e9REflzcYUb3yqqvwz6H/\r\nblkIhJWFW5Dt0NqTQQbdAP59SOHZ4nC1S3TvQJ/8Txup9FVBhrY5aD5Vnz6z\r\nqeOU4mRMWgXYVr3i9vHhgqtWLkm0xD9bahGnILw7d6fgf6LVs576cvpTjWlk\r\nQeRS9x3fhmSDKux2S2yBIo8A/2IgbBfan9WR5lmV2hzOWk1ZzR9+b0LGanXz\r\nBWuS+y/3bfhMZUoqywLfkXndvpusY5eTu9hfiLKAaAMN4JZF3OPa2LAdw1mB\r\nbn446uRUPxA52ugzcwbe/sQKBS/V2oc/cHn+qfz+knwEFRdIsRpLv/6E0a+E\r\n8hpsftvIO5FggZy/mTvA6ykP8F+xPCEBK8bUB6crxZSdpkXNzAjqxzAKTjgY\r\n92IOYwzSNy53+3lFAt8nZ2Fyey81GrJhC4Rbsw/S/EdHqzRJup31dDefGeiH\r\n79ezo/azngOpVe8tqaTXZE/BIOJehqzMZTdnfwc/lHVOY3GL00uDfUJ8qTwJ\r\nMC9cgy5kNIK4zmjDMRWrToEJrA3R2iCoF6SsQ7+sP3VpVERwEWXAVY/SfhI0\r\nFy49Xxuu8oW6TgsnyWtW4fWFeUiI97i6c2UE11G1BiOj0hqboQIvWTc19dSG\r\nIioFIgd71zkn2WrtosZSy9jKJRhUD9vsW30=\r\n=BszC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"src/index.ts","gitHead":"9c8618e0aeb766e24a10c62b4fb2df8665181445","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc --project tsconfig.json"},"_npmUser":{"name":"xtuc","email":"npm@sauleau.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"8.1.0","description":"","directories":{},"_nodeVersion":"16.13.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.6.4"},"_npmOperationalInternal":{"tmp":"tmp/d1_1.2.0_1653397985758_0.3308513156543742","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@cloudflare/d1","version":"1.3.0","author":"","license":"ISC","_id":"@cloudflare/d1@1.3.0","maintainers":[{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"xtuc","email":"npm@sauleau.com"},{"name":"cf-ci-write","email":"npm-readonly@cloudflare.com"},{"name":"cf-ci2","email":"npm-readonly2@cloudflare.com"},{"name":"worenga","email":"benedikt@cloudflare.com"}],"dist":{"shasum":"90de17bb89114675bebfee96c6fa16c0e48729c9","tarball":"https://registry.npmjs.org/@cloudflare/d1/-/d1-1.3.0.tgz","fileCount":4,"integrity":"sha512-+P92JVPafzAgW2WLNoSiduqiqoXKIhGNhrPlpTUKIros482moLUGq2ljQjbywD2bGWDw8qlql7B2yD0kKtfjoQ==","signatures":[{"sig":"MEQCIBKpb4b6QvzaSUHeaTVkRbNUODQHk6dJoGOqywv0k7g9AiBDR6vw+mSkzS8q3xTH2awMQq2DJF01RdLpYVH8V7G3aQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":4175,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijNotACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJZQ/9GyQ8p29DnUo8kO7Wx00Nuh+jRfav0Nzkqmp8R8Dye1gZLvjB\r\njwkLNLQwO4ZGysxIZKAeTMhrVNbuBZZMWwWXaK5lWMfEa5cmVwnNokqyfs1x\r\nw8y6s31Lh3Uf5KqrJgaIsHWqdKEClirbzaXGkanvPxL0AetFIP7dXflI/SHe\r\nhOzJ+rXrPB3u2lgZyxAwicg0fO/qwz6+7spKrkyPYPqxJWtYUq0zqqrZ/TgY\r\nmKPTckAiauEeFKPlPAR/IJcpobqIXfp/h+qz3jhb5h0ND98iUKToa/JEZAeY\r\ncDZ7bs2dyh+JPlRJLS0ufUqx5eV9HvzVvnLGtTTNHVq38LNQCceTLIW2Gj2G\r\nBDEakjTDwVsWweSv6CXjbqB7BoRJBjqY955z8nWGeXUWKVMPEDWnPIyC0ETb\r\nMToRNe8/CXD+uo2WHhv5LKVwymLHcGAwEiBwYam7sGixaw5sKEQzSQKTPQqY\r\n87IG+6cZfC0r/vtGYvyrBvPGEjMrx3vOuWPfMENzTiULZniMZV3LCILmfQdq\r\nRQcA8ON4bJ8LIhrKgQricjcbPjgL2O3ZUaYYMOx+6qdpyp/yb35KLqAkDqAb\r\noLbvyRkHJh5ZLS+JzobqIKlZg+o9qu42CdzxK/wKso5/cJ16Dy4JriZRM+ny\r\nc6GF5yhaeZl/dM3RMVEKvcSKwoNXwFPxoRA=\r\n=FDIw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"src/index.ts","gitHead":"7fbbc7ec3ddbc503eae0cbcf1ddd2c16396b3ad2","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc --project tsconfig.json"},"_npmUser":{"name":"xtuc","email":"npm@sauleau.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"8.1.0","description":"","directories":{},"_nodeVersion":"16.13.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.6.4"},"_npmOperationalInternal":{"tmp":"tmp/d1_1.3.0_1653398061430_0.8689186674014995","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@cloudflare/d1","version":"1.4.0","author":"","license":"ISC","_id":"@cloudflare/d1@1.4.0","maintainers":[{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"xtuc","email":"npm@sauleau.com"},{"name":"cf-ci-write","email":"npm-readonly@cloudflare.com"},{"name":"cf-ci2","email":"npm-readonly2@cloudflare.com"},{"name":"worenga","email":"benedikt@cloudflare.com"}],"dist":{"shasum":"d231df734661c00bc0bc365e2cab39f46d01f9ce","tarball":"https://registry.npmjs.org/@cloudflare/d1/-/d1-1.4.0.tgz","fileCount":9,"integrity":"sha512-XEvMxatkUvi3klbRY43AQ1/Q9MdSA8eSbBgACsuCMGNX47d9uMF97FXaII8XyBHeB0StDyevi9u/F7pfVuiklg==","signatures":[{"sig":"MEQCIHahVwK2nldrawRkeAtjtb6LnwEd7TadrseT7LEzL143AiAu/t2oXNwelxra5omlBrvhMGDLdTROfJpUgHmZRvWeSQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29226,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJikONkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoI7Q//Vp3ig8813agt6jOsWvoI9zPc28G1U8WNmr9CvOffuGIZiV2A\r\n5D5mZAEF5e/nSwwyxMKYvrjWEGGLlNWq+mbopyLbwCQfBJj6BD842O41CckT\r\nWCcFPJgc9WL32z5fLSAnNQJiHVnPT1SaqoZ/qQVTSvr62CB+F1tV10KVHc6u\r\nyvnDokxfas8bHTBx9kUcBzGbai/slk7cdquZST3MUfjPDXkr+GCyzfsDUPCA\r\nnp1G0IC5nPiKU7k6wjR394ILhdFW27FAwFLD8wYJ5RQ2HSMa9njT5tDRuP11\r\nlXSv9GklALcd63WXoMPLsM6jrITHGgjBP4L+pCSeMdgngewRvJyaHmyvOsNv\r\nbrT2gCO3gCCRExfbqwwuYpxQN9VeCRl4JsTE+eI+On099KIDiigAgw+u6Wby\r\nploDwDgIc0fUze8oZx/bGtdfruFaoiwC/xkvnUdMlig084AtA2CujrGMiBrE\r\nGSAcqpFkWMpbeRfnQM5JCmkDyv4AUORIa+RSjc+fYy13sS/mJG+pl9clp+ru\r\nhol/7y23QZP2fPkf7M8g3XFfG/fPjB1PwAhkDyKm4ba8xfbsxRx4Crekyud/\r\n2GgsrdCdDTqj3LCw/QOaZk1NGQo9ZTfQHa4EIDPTVqJpZ+ehUF/NfmRMc24H\r\nBRCpr1v4dZeqQ1T/PTUFVzE0s0A+5toN7to=\r\n=hK0d\r\n-----END PGP SIGNATURE-----\r\n"},"main":"src/index.ts","gitHead":"d440418a0fed4360b2e25e2aa2a2475d805ed3a3","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc --project tsconfig.json"},"_npmUser":{"name":"xtuc","email":"npm@sauleau.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"8.1.0","description":"The D1 Client API supports:","directories":{},"_nodeVersion":"16.13.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.6.4"},"_npmOperationalInternal":{"tmp":"tmp/d1_1.4.0_1653662563870_0.9293006404252542","host":"s3://npm-registry-packages"}},"1.4.1":{"name":"@cloudflare/d1","version":"1.4.1","author":"","license":"ISC","_id":"@cloudflare/d1@1.4.1","maintainers":[{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"xtuc","email":"npm@sauleau.com"},{"name":"cf-ci-write","email":"npm-readonly@cloudflare.com"},{"name":"cf-ci2","email":"npm-readonly2@cloudflare.com"},{"name":"worenga","email":"benedikt@cloudflare.com"}],"dist":{"shasum":"38550b1a918e1bde94c46757620fdcb624c000da","tarball":"https://registry.npmjs.org/@cloudflare/d1/-/d1-1.4.1.tgz","fileCount":9,"integrity":"sha512-czIBkVoZG7csWK0GVpWXqvnfM2Uv91AqdhwXeTPd1zpdQ+x/or492tD1ybVe679868bGMsHRqtHxp+5rwHXRaA==","signatures":[{"sig":"MEYCIQDRVzpYJQKt/xbs/m4ulN3X494santKl2rKWwhnNgCZsgIhALBmC2EL68nSOMTe3yoe9q6TNn9qyLHDiRXUNO2DPEYn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilzX/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoqVQ/8D7rplwFfD3GjZvcUax1o96TpnrhNk9IP1gbqvaq7XWWX/bfI\r\nYiCtKIw38Y5tqq0hUbrgGdYM96G+G/ipmd4pblVLh2t+Wjccfp/iv8AzLBL6\r\nFFqr4vX+EeHDzC5dg1cDipHiUhZQh5SraCAqCzCYZTKrBAIgEUpW95yWd6tJ\r\nKmm1DpEAzvGz2TQm+6XHOjxzULRgMqkbkpaQage6+ss+hd1hv7O57tuDM3oi\r\nn9cwjOXrGI092GyzQtIxyjZOqvdh5Z2q55HYURWs43Z+B0A4SAZwYjPBrWkR\r\nKsiFIVpzhpbk2mfiH9tC+WMjQXtXMLRd3uFKHyP3uO/Jz3QbipFrj2Gcrf/l\r\nI5BMDMFBEvDtW1Sm4JuTZqvzyFEWEvhPdoi2MMtzyXFGncAFLccF9TmD9mXi\r\n79U/GliUamlnVuYw0ih4r7Z3Aiq2eBXSIi38Nbf92Rmv1PAIMQ0r6trNksau\r\n949r5MsUUwfnr/faH2q9sSWgjFNow1sONxpG1eFYfRRDEWVKYisdXQK/KeEI\r\n5w+jAvwdWCVEadPfbfbVS5Y/uUGCPm2U//aJg5wW47RCA3LNL7dndWhCbPpy\r\nKeSaDeb7lCKmT2UH2qA06NiPN5fO6uofkgq58xymJyfxDdRRss2K/KKmgHrZ\r\nl1n9DjNwe7KvBcQHn0LwFBLXdZvzwDdMP68=\r\n=pC38\r\n-----END PGP SIGNATURE-----\r\n"},"main":"src/index.ts","gitHead":"1763f2059f387e2fed2732dac1739ac600886f23","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc --project tsconfig.json"},"_npmUser":{"name":"xtuc","email":"npm@sauleau.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"8.1.0","description":"The D1 Client API supports:","directories":{},"_nodeVersion":"16.13.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.6.4"},"_npmOperationalInternal":{"tmp":"tmp/d1_1.4.1_1654076927197_0.9180769857471172","host":"s3://npm-registry-packages"}}},"time":{"created":"2022-05-24T12:35:44.028Z","modified":"2026-06-29T18:47:31.173Z","1.1.0":"2022-05-24T12:35:44.197Z","1.2.0":"2022-05-24T13:13:05.913Z","1.3.0":"2022-05-24T13:14:21.586Z","1.4.0":"2022-05-27T14:42:44.066Z","1.4.1":"2022-06-01T09:48:47.383Z"},"license":"ISC","description":"The D1 Client API supports:","maintainers":[{"email":"npm-readonly@cloudflare.com","name":"cf-ci-write"},{"email":"benedikt@cloudflare.com","name":"worenga"}],"readme":"# D1 Client API\n\nThe D1 Client API supports:\n\n* Prepared and static statements\n* Meta information (query duration, number of changes, LastRowId)\n* Multiple batched SQL queries for better performance (avoids HTTP roundtrips)\n* Full database dumps\n* Prepared statements reusage\n* Error handling\n\nD1 is built on [SQLite][5] and uses its [SQL language][6].\n\n## Installation\n\n```Shell\nnpm install @cloudflare/d1 --save-dev\n```\n\n### wrangler.toml\n\nBefore you use the API you need to add this to your project's [wrangler.toml][7]:\n\n```\n[[unsafe.bindings]]\nname = \"D1\"\ntype = \"cfsql\"\ndatabase = \"testdb\"\n```\n\n### Import D1\n\nAdd this to your worker code:\n\n```JavaScript\nimport { Database } from \"@cloudflare/d1\"; // this will be native at some point, see above\n\nconst db = new Database(env.D1);\n```\n\nYou're ready to start using D1\n\n## Prepared statements\n\nPrepared statements are precompiled objects that the database uses to run the SQL\n\nThe Client API supports static or prepared statements. Developers are incentivised to use the latter because they lead to overall faster execution and they also prevent SQL injection attacks, but the client API won't force it.\n\nStatic statement:\n\n```Javascript\nconst stmt = db.prepare('SELECT * FROM users WHERE name = \"John Doe\"')\n```\n\nPrepared statement:\n\n```JavaScript\nconst stmt = db.prepare('SELECT * FROM users WHERE name = ?1').bind('Joe');\n```\n\n## Parameter binding\n\nWe follow the [SQLite convention][2] for prepared statements parameter binding. Currently we only support Ordered (?NNNN) and Anonymous (?) parameters. In the future we will support named parameters as well.\n\n| Syntax | Type | Description |\n| --- | --- | --- |\n| ?NNN | Ordered | A question mark followed by a number NNN holds a spot for the NNN-th parameter. NNN must be between 1 and SQLITE_MAX_VARIABLE_NUMBER. |\n| ? | Anonymous | A question mark that is not followed by a number creates a parameter with a number one greater than the largest parameter number already assigned. If this means the parameter number is greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. This parameter format is provided for compatibility with other database engines. But because it is easy to miscount the question marks, the use of this parameter format is discouraged. Programmers are encouraged to use one of the symbolic formats below or the ?NNN format above instead. |\n\nTo bind a parameter we use the method **stmt.bind()**\n\n### Order and anonymous examples:\n\n```JavaScript\nconst stmt = db.prepare('SELECT * FROM users WHERE name = ?').bind( 'John Doe' );\nconst stmt = db.prepare('SELECT * FROM users WHERE name = ? AND age = ?').bind( 'John Doe', 41 );\nconst stmt = db.prepare('SELECT * FROM users WHERE name = ?2 AND age = ?1').bind( 41, 'John Doe' );\n```\n\n## Type conversion\n\nThis is how we convert Javascript inputs to D1 inputs:\n\n| D1 | Javascript |\n| --- | --- |\n| NULL | null |\n| REAL | Number |\n| INTEGER | Number [^1] |\n| TEXT | String |\n| BLOB | ArrayBuffer |\n\n[^1]: D1 supports 64-bit signed INTEGERs internally, however we don't support [BigInts][8] in the API yet. Javascript integer's are safe up to [Number.MAX_SAFE_INTEGER][9].\n\n## Return object\n\nThe methods stmt.run(), stmt.all() and db.batch() return an object that contains the results, [lastRowId][10] (if applicable), number of write changes and the internal duration of the operation in milliseconds.\n\n```JSON\n{\n  results: array, // [] if empty\n  lastRowId: integer, // the rowid of the last row inserted or null if it doesn't apply\n  changes: integer, // total number of rows that were inserted, updated, or deleted, or 0 if read-only\n  duration: integer, // duration of the operation in milliseconds\n}\n```\n\nExample:\n\n```JavaScript\nconst { lastRowId } = await db.prepare('INSERT INTO users (name, age) VALUES (?1, ?2)').bind( \"John\", 42 ).run();\nconsole.log(lastRowId); // 72\n```\n\n## Query statement methods\n\nThe D1 API supports the following query statement methods.\n\n### await stmt.first( [column] )\n\nReturns the first row of the results.\n\nGet a specific column from the first row:\n\n```JavaScript\nconst stmt = db.prepare('SELECT COUNT(*) AS total FROM users');\nconst total = await stmt.first('total');\nconsole.log(total); // 50\n```\n\nGet all the the columns from the first row:\n\n```JavaScript\nconst stmt = db.prepare('SELECT COUNT(*) AS total FROM users');\nconst values = await stmt.first();\nconsole.log(values); // { total: 50 }\n```\n\n### await stmt.all()\n\nReturns all rows and metadata.\n\n```JavaScript\nconst stmt = db.prepare('SELECT name, age FROM users LIMIT 3');\nconst { results } = await stmt.all();\nconsole.log(results);\n/*\n[\n  {\n     name: \"John\",\n     age: 42,\n  },\n   {\n     name: \"Anthony\",\n     age: 37,\n  },\n    {\n     name: \"Dave\",\n     age: 29,\n  },\n ]\n*/\n```\n\n### await stmt.raw()\n\nSame as stmt.all(), but returns an array of rows instead of objects.\n\n```JavaScript\nconst stmt = db.prepare('SELECT name, age FROM users LIMIT 3');\nconst raw = await stmt.raw();\nconsole.log(raw);\n/*\n[\n  [ \"John\", 42 ],\n  [ \"Anthony\", 37 ],\n  [ \"Dave\", 29 ],\n]\n*/\nconsole.log(rows.map(row => row.join(',')).join(\"\\n\"));\n/*\nJohn,42\nAnthony,37\nDave,29\n*/\n```\n\n### await stmt.run()\n\nRuns the query/queries, but returns no results. Instead, run() returns the metrics only.\n\nUseful for write operations like UPDATE, DELETE or INSERT.\n\n```JavaScript\nconst info = await db.prepare('INSERT INTO users (name, age) VALUES (?1, ?2)')\n                    .bind( \"John\", 42 )\n                    .run()\n\nconsole.log(info);\n/*\n{\n  lastRowId: 56\n  changes: 1\n  duration: 62\n}\n*/\n```\n\n### await db.dump()\n\nDumps the entire D1 database to an SQLite compatibile file inside an ArrayBuffer.\n\n```JavaScript\nconst dump = await db.dump()\nreturn ( new Response(dump, {\n    status: 200,\n    headers: {\n        'Content-Type': 'application/octet-stream'\n    }\n} );\n```\n\n### await db.exec()\n\nExecutes one or more queries directly without prepared statements or parameters binding. 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 (example: migration jobs). The input can be one or multiple queries separated by \\n.\n\nIf an error occurs, an exception is thrown with the query and error messages (see below for Errors), execution stops and further statements are not executed.\n\n```JavaScript\nconst migration = await fetch('/migration.sql');\nconst out = await db.exec(migration.text());\nconsole.log(out);\n/*\n{\n  count: 80,\n  duration: 7655\n}\n*/\n```\n\n## Reusing prepared statements\n\nPrepared statements can be reused with new bindings:\n\n```JavaScript\nconst stmt =  db.prepare('SELECT name, age FROM users WHERE age < ?1');\nconst young = await stmt.bind(20).all();\nconsole.log(young);\n/*\n{\n  results: [...],\n  lastRowId: 0\n  changes: 0\n  duration: 31\n}\n*/\n const old = await stmt.bind(80).all();\nconsole.log(old);\n/*\n{\n  results: [...],\n  lastRowId: 0\n  changes: 0\n  duration: 29\n}\n*/\n```\n\n## Batch statements\n\nBatching sends multiple SQL statements inside a single call to the database. This can have a huge performance impact as it reduces latency from network roundtrips to D1. Please note that batched statements are not true SQL transactions. D1 operates in auto-commit. Our implementation guarantees that each statement in the list will execute and commit, sequentially, non-concurrently.\n\nBatched statements are not [SQL transactions][3]. If a statement in the sequence fails then an error is returned for that specific statement, it doesn't abort or roll-backs the entire sequence.\n\n### db.batch()\n\nTo send batch statements, we feed batch() with a list of prepared statements and get the results in the same order.\n\n```JavaScript\nawait db.batch([\n    db.prepare(\"UPDATE users SET name = ?1 WHERE id = ?2\").bind( \"John\", 17 ),\n    db.prepare(\"UPDATE users SET age = ?1 WHERE id = ?2\").bind( 35, 19 ),\n]);\n```\n\nYou can construct batches reusing the same prepared statement:\n\n```JavaScript\nconst stmt = db.prepare(\"SELECT * FROM users WHERE name = ?1\");\n\nconst rows = await db.batch([\n    stmt.bind(\"John\"),\n    stmt.bind(\"Anthony\"),\n]);\n\nconsole.log(rows[0].results);\n/*\n[\n  {\n     name: \"John Clemente\",\n     age: 42,\n  },\n   {\n     name: \"John Davis\",\n     age: 37,\n  },\n ]\n*/\nconsole.log(rows[1].results);\n/*\n[\n  {\n     name: \"Anthony Hopkins\",\n     age: 66,\n  },\n ]\n*/\n```\n\n## PRAGMA statements\n\nD1 supports the following [SQLite PRAGMA][13] statements:\n\n| PRAGMA | Description |\n| --- | --- |\n| [table_list][16] | Returns information about the tables and views in the schema, one table per row of output. |\n| [table_info][15] | This pragma returns one row for each column in the named table. Columns in the result set include the column name, data type, whether or not the column can be NULL, and the default value for the column. |\n| [foreign_keys][14] | Query, set, or clear the enforcement of foreign key constraints. |\n\nOther PRAGMAs are disabled because of D1 implementation specifics.\n\nExample:\n\n```Javascript\nconst r = await db.batch([\n    db.prepare(\"PRAGMA table_list\"),\n    db.prepare(\"PRAGMA table_info(my_table)\"),\n]);\nconsole.log(r);\n/*\n[\n  {\n    \"results\": [\n      {\n      \"schema\": \"main\",\n      \"name\": \"my_table\",\n      \"type\": \"table\",\n      \"ncol\": 3,\n      \"wr\": 0,\n      \"strict\": 0\n      },\n      ...\n    ]\n  },\n  {\n    \"results\": [\n      {\n        \"cid\": 0,\n        \"name\": \"cid\",\n        \"type\": \"INTEGER\",\n        \"notnull\": 0,\n        \"dflt_value\": null,\n        \"pk\": 1\n      },\n      ...\n    ]\n  }\n]\n*/\n```\n\n## Errors\n\nThe stmt. and db. methods will throw a [Error object][11] whenever an error occurs.\n\nD1 Javascript Errors use [cause property][12] for details.\n\n```Javascript\nnew Error(\"D1_ERROR\", { cause: new Error(\"Error detail\") })\n```\n\nTo capture exceptions:\n\n```JavaScript\ntry {\n    await db.exec(\"INSERTZ INTO my_table (name, employees) VALUES ()\");\n} catch (e: any) {\n    console.log({\n        message: e.message,\n        cause: e.cause.message,\n    });\n}\n/*\n{\n  \"message\": \"D1_EXEC_ERROR\",\n  \"cause\": \"Error in line 1: INSERTZ INTO my_table (name, employees) VALUES (): sql error: near \\\"INSERTZ\\\": syntax error in INSERTZ INTO my_table (name, employees) VALUES () at offset 0\"\n}\n*/\n```\n\n### Error list\n\n| message | cause |\n| --- | --- |\n| D1_ERROR | Generic error |\n| D1_NORESULTS | No results |\n| D1_COLUMN_NOTFOUND | Column not found |\n| D1_DUMP_ERROR | Database dump error |\n| D1_EXEC_ERROR | Exec error in line x: y error |\n\n## Examples\n\nYou can find a D1 \"Hello World\" example [here][4].\n\n[2]: https://www.sqlite.org/lang_expr.html#varparam\n[3]: https://www.sqlite.org/lang_transaction.html\n[4]: example/\n[5]: https://sqlite.com/index.html\n[6]: https://sqlite.com/lang.html\n[7]: https://developers.cloudflare.com/workers/wrangler/configuration/\n[8]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt\n[9]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER\n[10]: https://www.sqlite.org/c3ref/last_insert_rowid.html\n[11]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n[12]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause\n[13]: https://www.sqlite.org/pragma.html\n[14]: https://www.sqlite.org/pragma.html#pragma_foreign_keys\n[15]: https://www.sqlite.org/pragma.html#pragma_table_info\n[16]: https://www.sqlite.org/pragma.html#pragma_table_list\n","readmeFilename":"README.md"}