{"_id":"drizzle-orm-sqlite","_rev":"210-ddd225f04e7d16a7a323fc61727a50af","name":"drizzle-orm-sqlite","dist-tags":{"latest":"0.16.1","update-table-api":"0.14.1-bad61c5","docs-1":"0.14.2-c7344a5","AndriiSherman-patch-1":"0.14.2-314c1fa","feature/index-name":"0.14.3-67805d4","feature/pg-aws-dataapi":"0.15.0-2b4d90d","beta":"0.16.0-3e17d6e","feature/sqlite-wasm":"0.16.1-43776eb"},"versions":{"0.12.0-beta.1":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.1","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.0","better-sqlite3":"^7.6.2","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","esbuild-register":"^3.3.3","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","uvu":"^0.5.3"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"pnpm publish package.tgz --tag beta --git-checks false","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.1","_integrity":"sha512-WhIp0ivcgjgCLlpocvOcUSfRWXxvVa0kC5m4oXAppLhHSCRQWupSFWJ1FNswT3eV5U47DTzesEY/ZcTaWz99iQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-WhIp0ivcgjgCLlpocvOcUSfRWXxvVa0kC5m4oXAppLhHSCRQWupSFWJ1FNswT3eV5U47DTzesEY/ZcTaWz99iQ==","shasum":"7dc3dcdd76029ca1724eaab312449197a71f55c1","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.1.tgz","fileCount":92,"unpackedSize":131229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtpF0bOEqOb2+ko4VdhBJ9qwcJWC4A9xqjNZU/1x60NgIgHulBLG3bnKU+rG6kXa+J6BoTnTx03NupB9jp9GnPOWU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX/vRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRtQ//ThdkSz52SC22iqjvh0Esqlktp6V7JmbIdy1U3ITbkf6niL/F\r\n4vvuLn65LfgVeCnr8o8xWnlAhiu55FtnmPTmwP/Y4Jb91RiOZOzx9uYv0fq8\r\nUHiMwH8cA61MCLlQIRdh8IItVTR2zdzyh/jx8C1euRIttmGbVhCUokXdSC6i\r\nR8VbqzCS6bPLBSTurC0vgmvz1Daq+I1F5ed2ZwcHEZXnrwuLy+aaVVsxHUQo\r\n3vqHY9i4lra3G875KN6kP5ULq2yp3FB/m9z9HKm2NkvovzLudkNfZMWKFgOY\r\nE8A0Ma0hy23F+9PSOgAqoAV5MDdzslAUyIToZ/XLAOeU3FNfUjB28uqCxUYH\r\nQJpMNz8KiooG85AyaL24tc97zMQFxJmIZLCde3Lzw69eUshldA9sVVuEJO1s\r\nsxTv7fkI2LIa77M1Tj4YjMm0Q7i1AsR8I+Kq4zHlfws5wiubEidq6Xaw0+Q5\r\noOXbeInc8WYIDd8juYP7UcpAlIaooRLM+G0YSwnTstI032zniwBpEv9gyQky\r\nmeNwkL9PnV+WwEHYpC2U57j7XeLmr4kcUkxjJ9HXCiwY8B2XV1nQUPrZmihN\r\n0FuC9bdgFcXj8gGQuYADDOC841/rEETf+affF9f6GVAqmyTdmKI8gM7UdO5N\r\ncaEMMsXhvtu9O6FeiRJ0B5Z7M6EX7zaf//E=\r\n=IlRI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.1_1667234769583_0.4002286919483047"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.2":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.0","@types/node":"*","better-sqlite3":"^7.6.2","concurrently":"^7.3.0","dotenv":"^16.0.0","drizzle-orm":"link:../drizzle-orm/src","esbuild":"^0.15.12","esbuild-register":"^3.3.3","resolve-tspaths":"^0.7.0","ts-node":"^10.8.2","tsconfig-paths":"^4.0.0","type-fest":"^2.16.0","typescript":"^4.8.4","uvu":"^0.5.3"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"pnpm publish package.tgz --tag beta --git-checks false","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.2","_integrity":"sha512-SxEzlfJfDQXWpdsN5GiY0OaKXf8LXiJhKFgSoFX1gjpFPMEElgqiFfTQzNGu8EQGB8mgZSAUft9+Xc5aDRUMxA==","_resolved":"/Users/alexblokh/Development/drizzle-orm-new/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"18.9.0","_npmVersion":"8.19.1","dist":{"integrity":"sha512-SxEzlfJfDQXWpdsN5GiY0OaKXf8LXiJhKFgSoFX1gjpFPMEElgqiFfTQzNGu8EQGB8mgZSAUft9+Xc5aDRUMxA==","shasum":"30f6b27ece46f4dc55e8f2a16a0dae7d284bc423","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.2.tgz","fileCount":77,"unpackedSize":120318,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFQPhIBZJfH64nKzGTjVb4MZ60eSJ1TxMn5FgXiFRkRBAiEA+ltkuGRCGZhg/loXkzLEq+gASy7fz8Ug2miX6GWsf+k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYYFWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqFChAAhDMOde0uICoS+ci5Z70G3q/yuap8bMm5dYungfVxVlr1SujB\r\n9jJdZjenzDsqSuzi7IHbPP07ZgEhyYiQGtQ4iYm+H+W9jYpQfKvyvr6CK8we\r\nYwyPP+JsOZWH3VRwwxwlI5e2mXiiVcokgUoEKIZsYoU8jJpK/oypwiiezZhn\r\nwrBw7LjigLS2T2Jaw5tRQs8vmBMBMmNROQKocirKZFiDBj9RiF8X7Svt/ENg\r\nwTphAD0t6GFZV9LLCOkjRhbAXNFVs0GyvT7WpMp0sLKyvDfRO71LaE3Jap7W\r\nNTc5CYZ49ZrpMMKJRy346s51PCCgTPaesWb0MXLxcdVYJOfWW2476NRbZJNl\r\nM+QqhLDcjR6HYEvxxyMFYGgQAr7sfm1T9BZpNiyx49y9oe3jsrePK2sB59jb\r\n7JfU5VpQwRIMelKhv1Gwn4LGlSsqIEzOiqFkMrS5LP5qEuXrQ+dBmUbUCXn6\r\n2jzhA8r7+O54f4Tgr4YN1QQ/J1/V4fTygZetwO0Raz93wV8W0S9EZ4C4RePY\r\nDxh/AVLscrZ3OGwe0DkOWgyRwgUSADquP0G6XwD6CkvXe7kdhmBnbCwFofeN\r\nZJ+NY0YL92DRhjGqiHcC0S/1C/BxMHUnZxCbZgRtBPp4UcXV2uqRxHYmOPkU\r\nOglhtjUlAn++7r4W1oBHW0oIGzwJQUtpvY0=\r\n=4Mjq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.2_1667334486623_0.14086866209229298"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.3":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"pnpm publish package.tgz --tag beta --git-checks false","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.3","_integrity":"sha512-ESpdMbLUIboPVgByewB0yhO+WipTpkpmbFHq5styLE2j2wdlqHa/VHgK99i4+tt/cyOLB1Ah1oKcOmUHlQsPcQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ESpdMbLUIboPVgByewB0yhO+WipTpkpmbFHq5styLE2j2wdlqHa/VHgK99i4+tt/cyOLB1Ah1oKcOmUHlQsPcQ==","shasum":"aacd566ff96e9748677702bc855986fc3153c437","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.3.tgz","fileCount":92,"unpackedSize":132958,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFigazOjfhKtW2AcK+Kxz/Yun4Wag70LFqXMBodlyxMZAiEAmwaA5WI+bfkHKVs2YHIyivw8LefMeY/i1kkiAX32Eg8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjYlxnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo1EA//ag8FK98/h+mfPUFhXZKnyPk8bZEA2aCsHc1wxJdIBkTZ9JQf\r\nYXg5x/7+hi/wov8faxV6HD/qV856FTkWuR+A5Yv9FD8A4812NKqqsnhhMMyt\r\n5r7nfxw4i6xmTzRcOua6iJJOvjLfXVgur22HSQUfvoPJ1lxlxbjNhWzKICdn\r\nDWNSR+8qY1pzR8DXNGd72oBnd/XIHDiunYX9JR0xeOS52llOt7xlW7Jl05kp\r\nBTX9WTyFhc1OCzoGtTSpv4x8jenBOolYkSzfegNJy1J89pvbrakVlx3EdGvo\r\ntzznNOHqjoUt4dJ2bMdAH5oCX+Wwv8xqOFzpEpzZ3l93fzt3TB5IiS71vA6M\r\nMu/z4hCtuf696EJkAsEook6py0Eq2cccyGid9G03LgJT3qoHuqup5VcIh2HR\r\ntwLB9bbM1LOyF4ExmGSDz/uN2vuz09OnACPj7HMVbgVXxmmPzq2n/aEqNPtI\r\n9/8hlGST1QabCYf6wuR39GXLQ+mcoVOH2c3PAs0pN8p6tWHTmd3F7rRxSxbh\r\n9DcftLv0qAl+hFsevg0JjxMAww+9zPZ/9ruo0+tUWCQCcYtXlErfQ/ojPeyu\r\n0F9zfda7nGvvvmjDIr13fRzze49QANGxKc1dlT+DjnFVLQ8RND7GEggEfDUE\r\nat+zMau6RmNH6BK+s2hGCsP45ZD+ZOg1gQ4=\r\n=iBu+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.3_1667390567296_0.08550491302154284"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.4":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.4","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.4","_integrity":"sha512-dT46eszkuPvFpzYIf9MWUI7s7EG/jqY9Buh4pZC611YDKWwJ2XWm3v2nY1sg118MhWeyfzxoIZw7y+nROIXLWQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-dT46eszkuPvFpzYIf9MWUI7s7EG/jqY9Buh4pZC611YDKWwJ2XWm3v2nY1sg118MhWeyfzxoIZw7y+nROIXLWQ==","shasum":"3ee5ab3743635c00007d40de95c8dd66ccfddb8c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.4.tgz","fileCount":122,"unpackedSize":169066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYAoBc9gLpmpzla9kPnsAadqz+fmNmrCZbnZZULc01KAIhAKtaQXKsqgtoCOk+Y8zB64dbSy96xMEpJQjmv4sO8TE5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY7B4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8yA/9G6nHE/UMPex5hFUpQFbMxDpq+3EfrBkYbm5i6xxbxJNURJzv\r\nuaNfecmLI2u514SCh3w8IKnmZSJpff2/8Dt6c+XUk86DlhYhy3UJPPqQj+Kw\r\njZIS9PWBJQXzPuREMxOtNN6erekeyRZmsOo2BNgyR4cK0nibeHqiog0pcXMY\r\nZ+/uS67wYA2dPE7JpelbdWXYdWm2UEMx+7AqEt/jXBv7W8hxDhckwYWNwCEb\r\nQRw3Pq1FC7KWPdL5O3k3Zjtp56jSK2G1mm416Ka6gMhy8PouOG+i1MuDn9qC\r\n8ud1kTiTeIOEmR3IM0qFCTQG0uxodA+/CD3bVQd7BlCRjytriXjx0E4x710I\r\ni19bjl/ujRoKQwHXzFxSBaef1YjZ/V5Px9z6ZHX2pBdwU41fwABkOMRU7wA4\r\nCfG120T1nVKlrOI44pHU8zBmWmiGQEsy62i+MPcZCNicghj/I8mGpQuZs93O\r\nk+G2vYVMOoeSZzX1MCXTwOBES2sSFmduQTqPLsoF0z8wmmSGtZKGI1ZJ6DCw\r\nvfiV47XcEU6zahPWgmoSTxf1f/TiTL0xBdi3FHdkEVC6Pv+FgZCBE4BeAf3G\r\na2RUK9SHkEprQxhMwHh4DQjq475V2ohfnCYX/cHi/DnkBpgcahpBDldV3XH8\r\nnEaCjPN1G3bYf165QUAqw5leMT89Mw59pt8=\r\n=HQW6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.4_1667477624543_0.29065199749027526"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.5":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.5","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.5","_integrity":"sha512-ABm5wUvQK7ZQTbhUOmE7hAF16YDtvSzV5JOs7z9t7LyhZJSe+v4GWsFvIhJgTLqri8P8X2/U+1mrHEg0GjzcLg==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ABm5wUvQK7ZQTbhUOmE7hAF16YDtvSzV5JOs7z9t7LyhZJSe+v4GWsFvIhJgTLqri8P8X2/U+1mrHEg0GjzcLg==","shasum":"cb48c6af99eb8fd7b5d720971746f7f104e91e29","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.5.tgz","fileCount":122,"unpackedSize":169066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+0/oX4UfdAG1xN69GrAGuukqhXOxfQiqZrf2z2uIaaQIgGDPBgzJbVQPE44lxMhDehMkhWDTZdaYJojQnBigCSUU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY9T3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp9ORAAmLyCCnInnrLqVAr/gvsEm23FnF0KCNgjXFQJcDc65gdzV0oI\r\nLfGNUDz/LSgnCefA7dzzI5LmN/UzrBQOV71muROA6MmK5k4+kw9n/2mDn+d5\r\n7xS5K+RUJy51bIJP3E8jFxt9FgfqsPy0ddodH63xPQVfBrGELaubJQMQ58ut\r\nnKHZYWRrGt1HvjSW8HuqKWYuFpqHGa3TRMTZ/hZv5LqqYx3pTsoMT22D/fTc\r\nZWnoJmbNFGlrUaxE6JaC0IxTTH/pXoeT5mW/zFo4N78D5gY2RTH1DGgKa37J\r\n5DliJJ1fDspQ0YRci0HrYxzVdwp8CgIXtH6ISnMG48ypEy6usJx7DxA8zLTO\r\nRLaVDNuDu9BZbS0dbW7LB0DTa5Lyv6rTlTVGC0LDgHlUBpxfHGsGZ+rjtLF0\r\nO9Wc3DN/HVLW/mhQ9knoxiWe9HJr186+IDGvUfQREn8hm0LHymEMKxBC+TY0\r\nj04JSQD9/y1orZr/2V6MhYZGgLztEGA2BdWUQcDWiY/LeCXtJAgx+8zAIdgP\r\nsYVJCy76T2Pg6V1fSGuZoRCXkrPW++Qd1PZVLwlhyAKOdjCIgoPN2hICpv9e\r\nIZp/t3XRgSY0k3Ev/YNVXIekwvXmvMaTIMrllbunHNnGe5/8Z/o7qqMjgIE/\r\nxlnBh58hToG9RitJZ/a9w78+JYCeyHI474M=\r\n=2pMt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.5_1667486967371_0.006418401493059944"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.6":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.6","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.6","_integrity":"sha512-QUz6oVazn4Sez+UYTNjWqw+nS2OtAaWK5zQs8BRoJun1pQ4CTK+IhsGtM4QxgJjkfddihLdDChHdw/VEiRt19Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-QUz6oVazn4Sez+UYTNjWqw+nS2OtAaWK5zQs8BRoJun1pQ4CTK+IhsGtM4QxgJjkfddihLdDChHdw/VEiRt19Q==","shasum":"2b915e6595cca8b0b13b5e18283625db9ae67bb2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.6.tgz","fileCount":122,"unpackedSize":171488,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgvqIu1b9+0qIUouVlZywkZ2YktSazOcbWP+bUSxmKRwIhAO5rw8NEwaXPjnPezGUjS4L5mDMts8kh+78OVSudz/hh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY9jnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/NhAApQ/4dZPl52+VnABeBMmlBIT1tBQd+KPXOjFIPhDI90y01FzL\r\n8i6ltVrz2Dzi6dpXEPx5GwD9vGkwqvHIyXD4RDI27DKrF/SHxC/FeyvTg4JI\r\nsTETlY5T59E6tle9IWe9dj0+lEdF4m46DApeAPJVl7bGZgls89j75ke1JEWC\r\nu5t217hSfjZy5CTwfoKSFn/z+0gTxDn6hFsQC1/2Nkm0k9/JRl/cnlaQ87Tw\r\nt6zhz2ubzroZ6Sqg9b9qtfKvViwmK2XEhDjkOzUKo566LfpuEpYZwDnv+JQF\r\nDhxRBeyl9m7r/AAsK48+I6lwEk6cZGxejg6+RnF5W2kG7Z01qdK0rg8fm0VT\r\ndmYUAeZvtWLJjcUgjonmf/UlVxDQPkD2CvpHpnZpJ/60bXyUakAUJHP1GMnJ\r\naM0RQstDC48jyvcHfSMqOB3ljf6DOzc21WVhXVy3mu393Maxdji641zgGehT\r\nw5H7BCgvsl+injsLrHQkLiU35Q9tTbjGB0mwBoyWo49pd9lVRvV2hxY5irr/\r\nZ05swngibjIpsdy3kGv9CkguFuU+5RABgtXCuRNI5W3eO+rRKHYjTjGeuDVJ\r\n4/i66Yh9aoUr46p2r1dBUcWMuVNzLdTGWpOhAjclpZaVYpFHlqkp56hP0z3/\r\nkQwxwYu6C4dWgKsIAfEN4mGIMy0w/87+Koo=\r\n=gwm2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.6_1667487975114_0.6916160269637162"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.7":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.7","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.7","_integrity":"sha512-Eh2RDqyNjSmk2soCfrByaKAzoZL72y4iZJjkY4fPHqKO8RFwjZqILaYJFMU8RGKMlraUZVz4+m5hD3R+BDTbMA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Eh2RDqyNjSmk2soCfrByaKAzoZL72y4iZJjkY4fPHqKO8RFwjZqILaYJFMU8RGKMlraUZVz4+m5hD3R+BDTbMA==","shasum":"a1d8f4cf1923c09cc9157bb4f40a059f1e18eef9","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.7.tgz","fileCount":122,"unpackedSize":172175,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAzMGGQGiRv2FlI8lMlCnCYCBYyWscjWZO6ujZPzmnCNAiB8BAjDLrPfF7702fELawCBGHHRyZ+LH3PVN3A4gyL52g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjY9y2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmou3g/+IT7J9D+hjm8eODiwi+G1qx8HrNPrRCbst45UqU6gEIV0VRX9\r\nN68WeTr5VRsFglA6ZHsLmEkONzYQJz0WL87gMP/MwGECoFeL/7mkNj4F4HuE\r\nyd+NBjKnEmoA34SW9cN0kN+RPOs7W4z3sm30a0SAboqrP3S4W1FaI0ywE+Lz\r\nw579bcmBH4colDWaelItcIZGdt8vtV8a+aAOWnqK8497X4zg5opi3I/oTx4J\r\ncnzp+S5lMAvU3Gn0b3NZKxjgMVXNl1F44RSk9nb4rXhUkmScIcE6yW7I7ugt\r\nPinCpYNvE2Ktj4pDRCSqYkuyE9g7vWNBQz1kDay1nAQr01/YEz3422oHvnE3\r\nIeaL6cT1DbvlZsA5LdIXtv+ILswaE+VUh3KnazKfzmvoZG/tPnG4Bn2oJ+gh\r\nx2Mxyc6hyita26FWKKW/usK+K50jUQdd7K+4fBJuiRbML/s4lQtw7nyss3Nz\r\nKx+sM5vp9pOBw9k4lBYopGanWuAiZpK4WRW9dZdtYJQNhRVtrl5Gfx6YLIzV\r\n4HWiaLdd9BYaBj4jJ7qrX4p/vSgegKFqtwBtzKZh1ctLA95yTqI7x2lG3xBd\r\nynEFgtg48iJdwbjNOPXOBG8S9A8xEOCrJmYPVonm1Nin1zicOJToqAHDl6W3\r\nGcjf+d/XPOzSUZ/+yulR+VNpWeKBi6JLh+8=\r\n=k0NX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.7_1667488950656_0.32048863763718316"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.8":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.8","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.8","_integrity":"sha512-Fh+QR0Hpk3QS3eIx5xFEXV3wiPfvL9lY10YdLBSo+lN5Jgax0Q34724+84jwQa+9gEpm7mFppMJMDsd4UU/ZQQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Fh+QR0Hpk3QS3eIx5xFEXV3wiPfvL9lY10YdLBSo+lN5Jgax0Q34724+84jwQa+9gEpm7mFppMJMDsd4UU/ZQQ==","shasum":"6c07916c3b829967e0184c1be1244a11638667a6","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.8.tgz","fileCount":122,"unpackedSize":171689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCK78PsivHJRLPia133K6LMxoovfGh7LqJyzjbPP22uYwIgEwqaxjBUREC4QQD/O00zY8CknLU3osZzpXugZ/313x0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZNjAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoSEw//YSzfuFRLno7Pq1SM7VaA6Ud/vKi+sp0Hgf1IayYVZqmZQ3T5\r\nCVXCt4b+Jp+NGMBGXbSSa2NhkQFL2OLxk/1shNisYPGqFwIedM5EXDkMzO8x\r\nlYcXzgKLEbGnjh1fFNU4x5vg9Vj0ryUSvPJVjflDalgFaRkRvFXzjpsp6lIT\r\nBXpCaTLZl26K6wqlHFkfGqhZeVmpB5YzKtzvlL23I9ELMHUL5pMmTpN405sF\r\nZVPGK5eRNMBuH0qjxmSfHkoBciqfGHGo377xjPsUrzSOyznijuqxE30JKmbk\r\nWU8qX3in/GSJHt35Xph8FVb5pGMDVhilAfxI6+cw71IaHtiu8h9Dofn9v28u\r\nJZKfWYweo8/1bU3vTawuT2XLSe3MJBpB3Z+cLCt//cXLbfLhbidWNr5iG1BQ\r\n/WMJRRhZlqe0r0v7gWDO/tA9hGR/jofXkOucc2tsfo6Ll8C2HuTLSuv42gze\r\n277epJz2uG6zOUjZh8oF0t6yXfcrFlWacjD5Iv5D7F/7LnTSQLMev20pmaY1\r\nBJDn0LqEr9qpmBB86fROfl0l0kQ/sNd29oKxhluF8QNH8BlxWvniIt93lhux\r\nfYS+rJYDNdVI4SJ/RDNBJ4r9/gsx+pdwfouBfIDWhrjco3UhLijUroirfC14\r\nQLlo5jRdcK55ZsXp6mCGtQ5CvJGtjON/RXQ=\r\n=2F8C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.8_1667553472700_0.1944217329474096"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.9":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.9","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.9","_integrity":"sha512-Jckl917A93V0ZY5lNtnR2+X9K4wNazupwzNjs5jLHcsGJfLkSSm8QANnHLxBnmjExl3ubJBUyIvho+obWLtEjw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Jckl917A93V0ZY5lNtnR2+X9K4wNazupwzNjs5jLHcsGJfLkSSm8QANnHLxBnmjExl3ubJBUyIvho+obWLtEjw==","shasum":"b5f48894d445dc77a1e0e0530345d01d9182c7b2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.9.tgz","fileCount":122,"unpackedSize":174995,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCW7DtqIgKQGusnUDcJdHLuKyCufRa1MBwkXzWYkhoFyQIgewsahjUFsgVtKzE+6LwNVTIPN/Z/kZQQbbHnrXGIay0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjaPJxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwSQ//dxEqoKSG+lSX0iGwnovO3b2qIjQ5HyMI8ws0KCEZM0V+dGv5\r\n03rhFLU9sSv9fABslUU/CYoCtLqZ8g1KJXc6pGqjVSsCJTREeWhJuvkuTwIs\r\nbFHAvCx+622WsNuQcv8j7IuPeNSRHLank4Ch8UPGJRK1L53ch5QMGA7aUlbI\r\n5sVCxAODrzrCbOLiTBii2nZk2YJjhqIM/2XKo4EtoXll5pDaEv4hs8eyHyBe\r\nIfUhnvGPdk/9GfzExDmj252GyUyadLYBVyoWOrFjV34aMANCv9ITtzEGSIEj\r\nQcWMHawy7Qq2LTIyvfRHZ0vaIM26PNOdsP+w4KxxeCWAra+xILTy/q+s/mn2\r\nRS1uW+ORBMQffGFPOnMwo+wM/y/a6L2O6qilEEk5yd2zQSl7AC4oESKSwc6l\r\nEc+ZqAqZVwoc0UL8lgu/5QW8+J+/yHQ89JZhBCCwcKH6mmptDuj7D3zFx80U\r\nyhd7alG0d97f0OerkSJMwdUkbO3ziqEi0F+TwkGcSQZK3ratiVFj7rS8WV6U\r\nqEQBfM1qkC+g5aAvYXT6/0KQdhrF90GcibDh0pY4Z8Cec9uZQVafZ5mGf9YA\r\nJzu9fSCZOFBA5Xt9M41leM3Srh3zYsuQvIKFfOEVqIqaG/RCx4AL1LUoZZF5\r\nXGPeDEarJnpfP5qCsCSv5tIqLvciz2P67Ww=\r\n=MpFs\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.9_1667822192798_0.7849690623190715"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.10":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.10","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.10","_integrity":"sha512-6pIKdzD0QcYnKGT2s2CyiuIdbPJ3i47MzPgzrxCESQl7RbkoLun1hlavdPt1tEi0pqaGIktVAof6LSFw2Bx+6Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/cloudflare/main/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-6pIKdzD0QcYnKGT2s2CyiuIdbPJ3i47MzPgzrxCESQl7RbkoLun1hlavdPt1tEi0pqaGIktVAof6LSFw2Bx+6Q==","shasum":"765a453c027f784d789c4a6c1784daa12c4fd677","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.10.tgz","fileCount":104,"unpackedSize":138478,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvFKeN5y3G85mMQsa7xaNY75HqbMh72EBs+s44WEGRVwIgEUBgR2NdUmUxmOBn5PJcGYACn7cipm1aouP41nTWFTk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjaSL/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQ2g/7B4igB9s74ukmphcskFcn8sH+XcOSKrd+O++bZxPvBjng0LCy\r\nL24tK/nlgnLV3mKODIpQ5dYWMcFOCEjM1t2lN64En64rWDvyjzLCOisRiV1H\r\nrd2WnA7mkvxXfjJhvWRDgX1CFBUGX0GVdlky9lS5JiRKU66CIj+ew5BoWQLt\r\nIGuK7ADq/UhEdekpPst9HoLWPgx5sLIgN/ve/N5QLtuBOdmvG5h0QrDoerMb\r\nXiuIgcmzL3puVbqM4kr9+HZEya9xiHC8tLPvcagfPYjtpeGC3wQEYzgJJeWX\r\nV0PoOeDhUwxs1nbbjSDeWcWHqmt8tjS7vWBHG4GGa8NNHx0ZBjnX4U25HE8Q\r\n8TUbp1Cz/peRUekHYhSb27J8LeH9RhpmHLM64mOLE99QdsDXnR8dJqpyHneI\r\n+jeF/xgfVVMgrrFY7kcP9Nn8+O3Mvm6u3NyNnwmDBbKzBJlHH9mc5OW1k3Cj\r\nYcNQMA6IV6by1AdTiNYB6dzhuNx6foXi2XpNjiMkHHWd9lhOyktoEJqnCbwP\r\nytZ+Ne2GlwHnokbvfr0du6myMRRZSmUEHkW73TVfE5Zj5hjIithSspjWEY++\r\nF3xBkWx6pe4cc45ciUDtnFwavYlAeMmgp4jQJEnk/elN4lJA1M/WI0n5dYOK\r\nBGIETk1BECztSxHoImyqJwLMCtDusxbRAK4=\r\n=T1DR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.10_1667834622998_0.9491781205258245"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.11":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.11","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.11","_integrity":"sha512-nAUgQvvcw+1dU6H/BatjGU/aY4Pg9Xz0PdAT8Id4GYoWlQai7gPbq1WMcLukMOahby9t95N47a5fSZWM1lsJFQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-nAUgQvvcw+1dU6H/BatjGU/aY4Pg9Xz0PdAT8Id4GYoWlQai7gPbq1WMcLukMOahby9t95N47a5fSZWM1lsJFQ==","shasum":"9bbe0891e389172bf62bbf628316741ba505554b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.11.tgz","fileCount":104,"unpackedSize":138574,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgxW8QM2OgZYfE4Q3qK7qewQximwBkygmXA6t+jU4mFgIhAKc25ZeWTAsAJB60/8QpRdekBN3Mi9iw5XFTjyXKJ/yR"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjah2GACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqIOg//eli7UUuIL+0L1x1srcC1/5IVvteEhB6Imt/ui4RvMDsgcDm1\r\ntyMWvzvgyA2aLf1FaAmN0AP4hXkm2hLn1g4blajBDT9dshjofyNTHoESi23/\r\n8wo5X+sxprj1PCRN7+Zcbcy+QVwm/1X6+xyga1f3Nq/+rCbfnZSIWKLmR8z4\r\nM8fl3S40FS58T1FKzuJRc7jntaeg2fv9ebX0l+9RbYBCoybjicSWHkNwYu1B\r\nlobNjKL3ukm8/KeZlcpmho8dqvylxgFIXrdWAnHgQ6MBRxakbOVedOgBis0H\r\n4DOGv3KmUzn5/09yhnD0A792A/iei20iGyOy4ouSN9qgfzt/8ctWnwbvcgWu\r\naOpiPrCAvrQrJL+GUM+6ZzixbLu/cu/iERG74Lai/DNwDJKS4IPWKjvlR4Yp\r\nNWK2BLsGYTkaR8LqVaOo5gxPtajmZT9sNKCfuPtk0dJH2HkxZy/Ts5nJAZW7\r\nCJzpQ8ynbuq6FH8mN/fOoHYeHxFHaFCoU3bHhFQakK7dIjUzhmGY6lhzamQO\r\nTy3uR8RznPsjKm9tSaVY6JvPAiH+xGodZIGdbHWRsOhq0cda7YvbOfUYNzo9\r\n2IE2hnu44tKpEAr7vs9OugeV0mIDWPWegy9+cguGTiPGOop5q78X6P7Y6P9n\r\nC1eQQOokbL9EWc2DaaDFwbxM2FFGQmnTUEQ=\r\n=rii3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.11_1667898757809_0.4928715448118923"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.12":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.12","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.2","@types/sqlite3":"^3.1.8","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"concurrently -n build,test \"tsc -p tsconfig.build.json && resolve-tspaths\" pnpm:test","test":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.12","_integrity":"sha512-9Lx82tTmc3XC5BZV8HdR4ueJckNrPefcJzrQ7TgOlcgVfHdHmE8fH0qiYAALUswpuVJ5gMzA30nxLm/EY8VwqA==","_resolved":"/Users/andrewsherman/IdeaProjects/almost-final-drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"17.0.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-9Lx82tTmc3XC5BZV8HdR4ueJckNrPefcJzrQ7TgOlcgVfHdHmE8fH0qiYAALUswpuVJ5gMzA30nxLm/EY8VwqA==","shasum":"73e0b438bbfae0c9786236fa3de4bb3a41750002","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.12.tgz","fileCount":104,"unpackedSize":140159,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICouKQtBGxgIJfw414AYNg3R4EXFm2y68PGMJplt3AhgAiBk2i6mt1Y22d0awr3K+EfMtDH2gFbRKVxaVpuUaA+wRA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjchcWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUew//Rajsvlltq3YFOlh+HxVNLP5/j49m2v/d+EVAo7qvUmjfmphq\r\nNGgO2lgy45tO6wzHc55uGZoFBG11HChjdAR6ypvbfH5oROB+yuCDWU7w+y+I\r\nh8a3Xjh2fc6PaXBrZYg09w6VOo2jBO73gq8IuvrWEzDB0/i2cUIvGU2hX+Bq\r\nWWUTLfB/5zNPOCD3qor+ZWFVwNaAV8dmwaycNABzHI4IU02Hy545RCqQMyND\r\nz7b3yBjFLHd1LbvkrQEqAYhx7Ng0uOfTMM17MY5GBrasFYc3ubmeUmdDLbQF\r\nL4bU+2j6W/17/Q9OsV79nv434YqVIMiceT/aCfk6xp7oQXyedZXeM3QvpJG+\r\nBqlVKMWaX3MnVSTM28xxU5MIFp/KecqXeL+zB1YIaY4TTWeoaK54VOqBLQXd\r\nTimSASIyF2QsX1nmcxCfBCW0qmJUgs2ycZQENyQb/Y3KhLActitfONeSjqgT\r\nKEgAiiF+cBZDtMmq7digh2KFm/i0sE77VQr9H0EddhZY4xNnHEFoAgNZVOKR\r\nbb4b3VrS8BGcVwNe6icI0CR3Bnb7dRs7T5Dismsx0PazPtm8M7Ryj41CnOgZ\r\ngQuUJWzy2fIeRMomT0nLoiOahXf7juugrmOvigmVIp7U4co6Of/MTYG46KzP\r\nVUchCZd5Cc59VQdfy8ysT6RWIYR6leih+R4=\r\n=mKjV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sheriman","email":"andreysherman11@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.12_1668421398466_0.48778959261065036"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.13":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.13","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <8","better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.13","_integrity":"sha512-uxrja/cOgsIZH0tFp1l8QixiDs2mwgR6Tn1F4dcnm+e46DdivAW7BRCCTzHCNrzP6mvBnIqXtD3ygsL+FAnZzw==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-uxrja/cOgsIZH0tFp1l8QixiDs2mwgR6Tn1F4dcnm+e46DdivAW7BRCCTzHCNrzP6mvBnIqXtD3ygsL+FAnZzw==","shasum":"7928a96f005601a5b211b82e567614a6a6d7b54f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.13.tgz","fileCount":149,"unpackedSize":235659,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEpvA5un8FFLGxupFl/xXKB0qmwX4fF58uYcqyGcw8j1AiEA7+xF+CsOu5l9g16uUr5RqEC0gvpXP7KUu0uqQMt4Tzo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjdP8AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTEQ//ZwRMZtLnKUSi5pW9kKCoWstSp2/TsUxUm9swHVp0EEc8n9jA\r\nnyPBBThLA7Ny4MQR2Uq0b0KRE30mlFaUtOEMpvjzawwl09eWdR+0JynIXExy\r\n7lGcJbbJ07TqQv3fIbN33kuX7eYCx0hXEs8v/DavitPx6FugbsjwD+b65lPA\r\nm7mTd2lOi2vYDSa2cTF1FuGo3grrGL1am9EPm3R4VEQvtD/L6l1wLF8swrK8\r\nT4ZIzFm6KRQLeX3q1Np+jcHnugUil+gm4en+HqXTqPYaHx4mCUMw7PjZzJwS\r\nqH1Ws9qO+FFHByNQp5v96L1lCK8+ktVd4H1etuxUBwHjtjktngoloeBU+HIM\r\nak8XJz6ShRVK5x0+5375vftD8ZpqvUBlzzzAtS0YCFbK/cM6xzRk0Jn2yHIm\r\nA3Sx46wF+FPplR+CvHPNji+8sV4mZ1hugzLGnUFfWjDUAq8r52X2paXU5A8P\r\nZeDh+8N1C0uyi11DeYL/O1SannhTE8pduuXl+wksDusO1cc7qpJdYrwvAw6L\r\n0h1zPDN248n8Z5XFVH5tgDDtGo+gcISxOjkiaVMMUH5CmJ1gjPxrwqHg2Uvy\r\n/gz588WdDyypgbCCAFfM3XVDIjwGx4ib2HdgxX3d2DuDw36eV7UITSefIJZd\r\n8oitsA6UiOnNhs3Z0WmSlOxzE3x6ur6srdk=\r\n=R/dz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.13_1668611840753_0.8837008572584508"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.14":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.14","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <8","better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.14","_integrity":"sha512-3ksRC+lQSDuISYNKCCnTzQpaVdJpYZ1noR7EpC7I9ok8SQ4Ya1FVhCl2yRvLERS9GyZ8KCrt2e6BRzMk5ItGaA==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-3ksRC+lQSDuISYNKCCnTzQpaVdJpYZ1noR7EpC7I9ok8SQ4Ya1FVhCl2yRvLERS9GyZ8KCrt2e6BRzMk5ItGaA==","shasum":"90d6bd8ce03b3c540ef7cd91b25bd3cb3cffd220","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.14.tgz","fileCount":149,"unpackedSize":236824,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEkgYP8HhBZWjgppBwRx9+06jHtNaaF8TBOKM2xCXbR3AiEAhWAzIVmCkTinMKvHf2o+QAXkXiV2IkZEqqYgN5LzqF4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje4M6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJ/Q//dJ1k3NCBAWz54NnJyF2VgzGIpeAQ/LDs0uWjbKPMZif7i49j\r\n5edw1tYVzos1JAYUtiLduS2ZkVwleM2Be54Dd/xXDTsbG+rU8TulhZknienq\r\nFmYN0zjfyilWZqhUXJYiJ9CqoIt3Q/ANC4WXVmzMavrrxyuXm4XHDGhfAbnC\r\nHy2nsAyfhhTrK0K5B20oO0xTQLtoeNBiZr6PQhlUEP+YbHc6/hx8UuJiJ231\r\nGt6hr86YDzpoGFH/E82HkxfIjnru5dtrL/01WN+3cq2SawclU66rLBPZZ0RG\r\nKupSvZgi4JlDlj8JSGMa1YLticvGWMO8TirUb3uVTxkbw+UBlR4lmmrl1O0r\r\nPbmcNJk0OWMuyUhKcHpzh+RC2LxjF9VWaHSiBtKRJtSWgCuCOa9aV5wykhH3\r\nQ3ZI0R4Sc+vLyQCKoLH5qlIICZR/drGCtGx+weTC4sivu3Foo02RYckgB1Ow\r\nY4Mp1k3JByG/hZ1Cgq7J4UwVLE3FKVBy1t24x09E0oH/yHw5EIi4TozQEPhO\r\ng5qn+pW1WeB6WDYhqGSvnRzW0kWFwVtuWzthR4+70jDcvBZ7FsxWPtd+MXVN\r\nO++R6KQtej8y9475j8RKprlHHo1/bKcx3futuspsIwWd6oQaW/LRu5n+AyWA\r\njkZM5o7U4VeFiVv8RBbI1GAbAuDr/fjFQa0=\r\n=uYTt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.14_1669038906485_0.8198883190190089"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.15":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.15","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <8","better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm version prerelease && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.15","_integrity":"sha512-+fZGTPSL338XXZ0COtsdsdPe2RvkyLpeXVeGovzOwnU75/9TVZd4L5X+F/cWug3eLXkJYSlibUiRBI0DMce+nQ==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-+fZGTPSL338XXZ0COtsdsdPe2RvkyLpeXVeGovzOwnU75/9TVZd4L5X+F/cWug3eLXkJYSlibUiRBI0DMce+nQ==","shasum":"8fe0bda4b1775d6ad98f49a65fbc0bbe6c77174f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.15.tgz","fileCount":149,"unpackedSize":236848,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBsTvCmFHYQ5tFxRGnW/gL0nRf3+G43njwO0ufv+uhBwIgHDGaQxUi3LXVBYHkYo8aPK2Ni1qCycmWaEjviX7oSw0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje5PPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7qA//YGJ1xHmRitt0wGAuxq01kHwhqy/mvHl6cIenhBmIaavSjfaR\r\nl1cduwA8SJFnsFe0aB81kcrCEZflf098/Oj+QPpSUiKjLdXrQoFN0oXOCiU9\r\nSdEuE9x3X6LCvDASMEJYxpA02z2DHVNYnU0etvJZ8RQ8uIftpdNKtwaFWq7z\r\nVNK7mkC1nyH8lCBFrGhCj78jJW460E641tlhDdoM6ucXbLgG4k/PHccKAqq3\r\nYp+yeJ6vKePym3CVm5k70B+Ow1wdtfAykBX+ryXoeqLUtzLRnuKWi1/9fXEF\r\n+Uji5I4N/8jIYZZ/ZlUFdmzwJPYDJBVUgex2anHCd5gJVgnlGCvvu7AV8FFA\r\nH8512AxEyz2OUJJOKJ2DndZm/xhpViX6lUwx60vwlbhPXWDJx0IqVeyuppKK\r\nwxhTWilRopeivcNtOG0QMqE8gQ4qFfJr/In+niA9+ufslK3h0yR/J+uc6/eq\r\nW8g5BfBLj8vvKDO4ff/Nwh33Qctyagx3aOxJmNOmchzFTzqi1uG+njh7Wu0/\r\n5gDaW5ZGzR6JW6ykAzaNjsIPxfhPXpmKKRUawytyd+es65V9DDyL44JAjT4e\r\nftdPdrbPf8qDBSrOi7D5A7mJNHKbOZ8w2pcrgwvX1NDvv2Cs9u5FdWN2EO4a\r\n/vx1Ui5ka1PG5ewDM4oxhouoAkZ3BBc8x2w=\r\n=D69J\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.15_1669043151702_0.5547817135225912"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.16":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.16","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <8","better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish:beta":"npm publish package.tgz --tag beta","release:beta":"pnpm build && pnpm run pack && pnpm publish:beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.16","_integrity":"sha512-dFiHWcnXQubw/XgjesR7teDrYHylM8vnZ0crtBcttKWbmOQl7QRbvYkBfaAmzzyeqN/T2b6/yxbhLAP6QAKz+Q==","_resolved":"/home/dan/dev/drizzle-team/drizzle-orm/main/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-dFiHWcnXQubw/XgjesR7teDrYHylM8vnZ0crtBcttKWbmOQl7QRbvYkBfaAmzzyeqN/T2b6/yxbhLAP6QAKz+Q==","shasum":"c3dba800033e19ac9c1b6cb019211ad49ac6e008","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.16.tgz","fileCount":131,"unpackedSize":215977,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQYhle0Vu7mxfo2f6LCyUNB2HUGJtWued7Ungo3f3pKAIgNrNj2hwbROV834TmMgJr8HHZs137Wgg77SUyeq34FVI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfg4JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqaxg/8CQjUk62RU+2VRyFY0tqhcmilEuShkxOfIw87Giiillcy92lo\r\n8IN9xmpi42axOH5qauy8FSpIEgDgf/qUh62t15Ea4CMkkkGPPaOPSm55J7Lo\r\nrzYRf44I0ybqTPVvUECP9NRwoJ6f3ETQz04qFfSTCR0WwBIGKM2laAFIkRhw\r\n72icYEIctrX/6WAsmb9UK+E24PvIiJV0SXT0FYNrLm/elNIbCrxRJqXJdQn7\r\nJRZckWTG5raYSljGqEyg8CnYEtBEvjY0GP7Pu9e0oQdZa21h/HOQZTNaYz5y\r\nDXHRmLfmYIhs6WW41/pq8VNvnpWnrPxzE7fSYly4aMIdCggAPjkZxDkbuu9h\r\nYbZRbJD0Tj0BSAqghJgvtkH4S1T2EZ1TEix7KR9ZcZrq1UCY0KLc7KIaO5Qh\r\nWOPn4EQNvt1ZyVhdLB8wuIyVFD4/8hqrT8iNadV3UiBxgTUP6bgjikvlqHRF\r\nrkGevpaQIIWcpL2xnrZYF/6g4mSfa3U/FUZsxbp7HrV4X34AHd8APY4zS1XV\r\n79Qyc3eqSPpOyGYPJnsysCYqe9xTqtrvNDIh+GC6Z55HXZAIfeE1sKISuFRc\r\nanGPlutWXqJ20Fe7mmrMeA1U7/MjjHetPhfSfbHhb9gHdLftW5jSUmrdUG6o\r\nnmaC1SVdqBZq78DCICYRlb1jsonPnHYLPUQ=\r\n=Rinl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.16_1669205513583_0.6364793088646588"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.17":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.17","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <8","better-sqlite3":">=7 <8","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.17","_integrity":"sha512-054gwgET+o3x0NEoiTaMgme8GWbnmbagAG/zAfKIXWnqv10n4oP+blpkDoHFBzFuVN/EsflY4hBltctrf66vyw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-054gwgET+o3x0NEoiTaMgme8GWbnmbagAG/zAfKIXWnqv10n4oP+blpkDoHFBzFuVN/EsflY4hBltctrf66vyw==","shasum":"a67ca8bdae13978b869e50eb8f93ea88c3f35b44","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.17.tgz","fileCount":116,"unpackedSize":180925,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGu/YDdTJznZaLDBNp3LUBOHHWKXq17iy4kx/slEpjYwAiEAvM3VlFTs0hYJszT58+NqMkKSqf+PD+oVmArOL2BE/yA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjigKcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqarA/+J00FtGhBlEIlzXbpxyZysvNUIP46YonUGwjHBVX3v14xp2u1\r\nKPQCGXqQ95Dlig6nGUXXEjzaN4/OxfKUXBcQmMAW+imoX1zq/FXPVqRY/uZu\r\n52IWbD5kwiuS2hGleuGaAgRvCVx69qYEQWqABz2msy+J2+L3xGUlKf753WQ+\r\n96GbBKvQiwrW2i1u11++bGXipzlscKTpOOQINmjm+Iga/tyTntkK4i9Yhg7E\r\nnCO97d8FugRWI4Wuur+OPpuGmX0flwLdr5osRNdYTbMkIDJcL8XJvdZitLdj\r\nofV4+CLT6lhld8vdxWPpLeWByHENIBAfT5UPIwztqVY5GH3MmJa/ZtwQ4iYD\r\nAIwAbiA2lzHkVlUn790IG7CrJHZH2Msn2tWdJqBuoUmNOWIr2glGodkWnfbp\r\n6gKnCkOHHIZ+RFdQpZWtbDilJabgzmW3x7qFRmmfgMhHrYkAPD1PHD0tkW9F\r\nYplythvuykTHiqs0UqbcsQdsxfcBUlnU0J3Ofnmo7jvsh42sZ87SGx8Vs6vj\r\nC9UI82o0qxJZYUbQbJ+92Q1qJIR1HpCkOEc+OhnvM4ipTEu+3X+g8cOpuXr9\r\nzW/Ic/MfGqNwYAYYcDsUnG7RfX6yuiBs0vnsRHSKVKJ6BCgK1epCMtFNrLrM\r\n7q25mC8KKMzYSB/NppIiZfMON+WRZr8Rdqc=\r\n=6hZR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.17_1669989020359_0.8584465327072719"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.18":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.18","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.18","_integrity":"sha512-NezoR3UBt6pWCJ8A9ixUOqsFBJA6Iyl0PncyOmOzB39Kap8H4mFszkv2kMh/CoFeh/OYDAZU0d4s+PSrOd1ePw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-NezoR3UBt6pWCJ8A9ixUOqsFBJA6Iyl0PncyOmOzB39Kap8H4mFszkv2kMh/CoFeh/OYDAZU0d4s+PSrOd1ePw==","shasum":"17a08ebe65342e7a1f8c56f13a0d7737f7945c16","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.18.tgz","fileCount":116,"unpackedSize":180925,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDolR6Nl3+6NgdNyh//D6jIW82D0HqaSJJUho1CfaI9YAIgdKw+b8VhBHF67pphKVnb07VZbGyOxzNRqQWw9ZrqfBw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjjzwOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNHBAAkCHDqKukDb4m04ZqYQ65TrkLC8FJIez8P63Y7rZHBmm4h8Nj\r\nT/fQPBcSv8sG7Y5S5bLGL7qOkHveM6sNhCDWh6EuF20ee9LWbWbWPcHR4FdT\r\nGabvGj/GXCyhLHsuHU9al0gJD+2vR0/TAwlw7A6IqVAFKCDLWCjseW4yVjo7\r\nreADqu7s/dphLSgdfxAA2S4t5f3+3YLTXQZAfP+d2Wxl+qT9/ksQ8ce2YWOv\r\nIJt+4LFczVJcmCYxAFZnZZoxirIH+DT55VL0cm24HFjmMHOblborgG9srUfb\r\n7cOvhIuzGrvbuwJiWc4L5X2YXSBFfZFH4cZwRj+JuTICoWngHylf8XQa7Nq4\r\n40uAOPy31Sc0mdp6iQBHsN5CbEEBTrv/daIQ0BhxrlHmUOaGSCGW119LsLDW\r\nDEo1c/y9FaKlwQBJHg2fY9hAOJAy1NFOVkZ9KWMsveuHtIwc1y2IU7xB5gno\r\nJ+ipmciDzFRT9AH3NEEJlhran+7lRiUR10kADmUX58Pn0jngF2OXWbVHGbmX\r\nyi4zQ84ypTuwXIVRM+L0nXFK1vgIV6IHCCCeXrFWXdRXM9eG2P40UDF1EjDS\r\nV3FYdVi05eNgRzs2F7eGNvNbBlLI7rN97WGYdhG8l9JdXomcKFgdw/Gvjm7J\r\nc2PMRLJKTGqtO5oQ0FL6oHvmhAAlBHgMY0U=\r\n=YeKe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.18_1670331406129_0.6738624849994632"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.19":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.19","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.19","_integrity":"sha512-OGRR3QXGFaYKzlNbmvot80BaeWECU+CcQnhrfOs28N3+P0sNlB5zbqDJD1jAWiL4nOJa2innTPrrNaH9k8jyeQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OGRR3QXGFaYKzlNbmvot80BaeWECU+CcQnhrfOs28N3+P0sNlB5zbqDJD1jAWiL4nOJa2innTPrrNaH9k8jyeQ==","shasum":"d1acb78814f0c459b3f12ca27084397460a6238a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.19.tgz","fileCount":116,"unpackedSize":180665,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIENSyDNnvI4Yz26uDdDtiWbsANpGpwrSbd5eMXshdkYQAiEAgkYY6pfTEemtIJSxO+ienWfQ3v2G5coo5044s5a3Hmo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkNgnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrdng//UiZTH6d9cMruD9K5++8KX44iYfrUNYqIzqsf8+yMaCRPPlRr\r\nTwBL/OzEKvpUBu8hh5OoCDSPr+k3hugkbQe+fvAAkUWuI0gHzIr+EgHMoLOe\r\nx0S+gmCS0wSvI0n8MjPgJxFldZjZWmrSSiE7QZiZiwjx5Hw9bUkL1gZw1h7e\r\nVTAxmnt9+ruZZ5LjR1HsRHcH8aO9YPGjhbtvCckecwvt5souFngoZ6Ydrrmt\r\noynH4OOG0LjW0M2myMwZrtV0YU4V+uxybu3NVquE3jrHlpVZc5BYzBJelfyd\r\n3gEBMXKJIeFt37VRzOeXjjiOdDKtZXB0kloxvl4UQtDD1XCN/8g/9wZ5Uhqa\r\nZfUcHfFkkh5YSoAJi3RNVDT1Gaf8S7XE/JUiItNtqvFtLpgkjfXQFbmJTKsj\r\n5QiiRioV5C5uyR3GA+Dc4UtRAWC1HpnQ2kC5vQi3hrhvW0Q9X4LZXmRB+XXz\r\n0YnzkMit6syzfXUer+cmE51c4Ae3Gsn+Yi906l6D9qLUypdL5AwsWTqJFORx\r\nu3hn/lFgO4UA1isV5G5Y3tEmL+B1VpvtcPF36LrFfSICX4w72LBh3EhB8Xga\r\nim1/RROwK3m7O0TZcEg3Szkl92Dx50MALhR0Z8Gt+OQ5Lg1I/eQAmubpJ75Q\r\nf4hxDFk1Zg077j5XVr49HyLJY4VXdycdWhE=\r\n=DFpX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.19_1670436903230_0.5240013683304074"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.20":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.20","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.20","_integrity":"sha512-aZOzvljchfWVxR941i0ASDgf4S1DAxaOksbfAVdQUnuHatn04QiZKYIG1BxhURuoR7ha2PM0I5Hnhp7DbW4piQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-aZOzvljchfWVxR941i0ASDgf4S1DAxaOksbfAVdQUnuHatn04QiZKYIG1BxhURuoR7ha2PM0I5Hnhp7DbW4piQ==","shasum":"6deb132e0df4b7f101a5a65853a51d34f519baf3","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.20.tgz","fileCount":116,"unpackedSize":180228,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0e2ik9G07CKiLn5gGpJbeW0gwg9jNETX8M2ZDOlhaTQIhAO0ps9XYqmZPsBnc82WB/tAfY0eME5tqvjKeHQeRSdGK"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkOGzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrQ9A/9F6CazsD5IjQ7zJVy2IRZcg6ogMckD6J0P9vLQyVq2Ssgkx36\r\ns2FOSLCXjQeymik5eN2wH+lT5jSvPjOJnGkCnA6RGwcVgt9ZYRYWpl90fiOh\r\np7LOmxlrS/hGC929WJdKkF6U7jvkYEVR+2TJWcEKoe4GCEyT4X1d5x4Qra1Q\r\nbGILRItE4a6V24Dl16z1vfq7ZEWScOHSKezmj09Z40Dmlxf/Pz4CjvQr3H95\r\n3h9zD0+EP3RIxzV0qCGfVOdF/sunBp97NbfRUe8Eg11B7TqguTuzZdu+Zk88\r\nVr+ySp85lxOs8PQy4kQXsSTQO7qookTrsdfrEQhqs1hLCMGXwPWyslSvS/Gz\r\nrhYh5LyhT9pgY3mkR+/9ArEUqgQTXxj//qmfIl5u9PnMSnhnPJ6eRC1eyOfS\r\nYr/JPqBVv21AZRSNa6qXH1vp0bzbMtmSEBsL5OaqG0g3gErPaqueyOsNE59m\r\narn529EQImIH97LO3DLnpx4thKPnuUxnmB+HXWoT3S0dQvv1wYAc1BKk9h+R\r\niutAP4fQWJNPnHavCgG/O4SUP9GqYRq2tUzUwUEuWBqVns+RvuY/R1QIAECu\r\n56dzNkhRcwE/0IQJvDPvTlLgjw/PSQ4h6RqQ6QFptKyVJ9FlulMyWDsb83a4\r\niiQu9IZmTkJ75heOrfGbP/CP2HA02n/V9kA=\r\n=kEPI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.20_1670439346844_0.5167472679368863"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.12.0-beta.21":{"name":"drizzle-orm-sqlite","version":"0.12.0-beta.21","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.12.0 <0.13.0 || >=0.12.0-beta.0 <0.13.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.12.0-beta.21","_integrity":"sha512-ZX/E61idZ507KvqWlBcCuonZdiTqOMBbm6Ri2lj1icJBmn6eODsKM+QLqnQZyufrUOSyKAle+5e0KfyXAlwhDg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ZX/E61idZ507KvqWlBcCuonZdiTqOMBbm6Ri2lj1icJBmn6eODsKM+QLqnQZyufrUOSyKAle+5e0KfyXAlwhDg==","shasum":"82cfc6e22ea24704ab0f4f21c1b704f236f7af7f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.12.0-beta.21.tgz","fileCount":116,"unpackedSize":181886,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/+s4FYY8e7IR9glKQVTpUWdFMr/ie2ZbQIeOURVn6kgIhANh21T1gROV8WqBsP7wPJxLmfzqbByyMGlo9dHnB0FBG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkgdHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoPTQ//aa7//891/aCSM3v0OCo3fOC+7kF1Rnx0fSq+0Nx3nMY9sHi9\r\n0JJn6XKKA7ipgANiDdo16tP+/v7ZUtdZ9tX1ejvo3O2G1HSpwg4feYc3uqU/\r\npfydOz08mvhjEGL0duDanC9KToY8v8p/m8BbThz4gaCb/HWMLS/fOaH5SAWy\r\n2yJzB1R2mwZ90QXfGz0E2oB7Gw+g9T83Oars49mk++B99dCYtYKyAYOP02uK\r\ngZrj5DJTHojcCnUD2avj2BpzH7St5q9pssGmW8gYoJwWoKiTrD/zbLEAMyf4\r\n/VTflhZ+zjh57b2UL4KwFbjWu9pdO1MJPmaTZzbKzpFn5AQV1ug4Zsb8Q+A7\r\n37ky8bUvkNpeVKdJjsTENDrYVk4tUbiiTiyudyu6MdgSl9JhnoOGw49bmagC\r\n3+Q1i0hxuD2FkbVO/op0pHN9orsEZIKR7myJ7oid+SXKdHn09N7hWM5ACMWi\r\n0lHyPQ62rbX6/zoh0YBRBsVegHidkhpOG/OOhWYF+B+SGp20BypVcutYctEN\r\ntwgSeyN69nSEnVeSWdfM6ichw6g3oxKINGS07R1lhHijbwnJ9sDqjmF74274\r\nB+gYvRPbre1ZfiuzDU9ziuS06v6t6EG152hAkQLcPDowmwqXBWptAL5U8e8r\r\nIAXV//itvJCR95omxaLyatY7S1Jc6tMWC2k=\r\n=Hy06\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.12.0-beta.21_1670514503267_0.9319863873218199"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0":{"name":"drizzle-orm-sqlite","version":"0.13.0","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13.0 <0.14.0 || >=0.13.0-beta.0 <0.14.0-beta.0","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.13.0","_integrity":"sha512-W4f7InRi9CtBG4+oIFskqAWi4w73gmEEKyt4i5ls0StsmFG50S6FDl2uuJS2z2JBOrJhmgBngMP110hYM3L29A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-W4f7InRi9CtBG4+oIFskqAWi4w73gmEEKyt4i5ls0StsmFG50S6FDl2uuJS2z2JBOrJhmgBngMP110hYM3L29A==","shasum":"6af6cd42f061e124d4030f4103c399a0dc875ca4","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0.tgz","fileCount":116,"unpackedSize":181878,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDL9jMmFOZpXTq68mmS8SE2kocDmE3oSPRwDEy6A/N8jAiAyP2H65z9+7khGTzx0CorczjO5NtdcT+CnnTQ9ALx5dA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkhH6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmopPg/8CVyZ2GasCzUeelc8LUjlRYiJYPoN8ANSbh0dcxzHcBfuCKzJ\r\neqcPaO+pC27vrBYyRFT417SclKkJFmEzJ10lNP5yKSAuw5qm+HA7iwLzSu05\r\ngGg3dKseinzCJdk6inDxAr7lPxsNsFTyHWP5gFgvTmq0Ic2dc9i8NjNRCh2A\r\noIT0QMFqbPhAx9Pnt75TGytIc/OvZODecX/Pgt2oCI2Bc8wulmxqKdwTX7ox\r\ncz6m8kw6wHCZS8PyRG65kTZD/U+dgOTPZzOocEtSa+13ly7HGtAcbDn5Wd4f\r\nvC0A1DU1s8eFVMI2AchdXMn8RB0+n/bA9NPnuAUBfXdtCDXafd5vVs/1Jshj\r\nmpwffscfxEzo/BuZ3M1QA4Xr2cDBAurJPnNOkOK8wmIgqNoxfRHlUZW8bKHK\r\nwbiFdykUGfuvA7BT6vQbeD4WvPHxp5Z92ZmSkjImOA34tW9HhHv/HClshD+O\r\n7+aKfj0s6MYZhLrfiCZtvAzolm/MrhgWtg6qiXouZKLYckf3sifnNnaAAxVv\r\nF3r0S1/Q5m3W9puR0L0jPcT8/b6Ubfvu9fR2u6v8yrDeukP/Q8hCn+W9uEqp\r\nmn9TV86zGMm2XqJPzgIlwx5tplLJ9JXv7ohf/7qO8kyPJhsB712j2Zy1axPX\r\n0x8L8OnTANr6RXKmDrqILlpa6stFuMAOMYU=\r\n=UqkG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0_1670517241943_0.3642834558141488"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6":{"name":"drizzle-orm-sqlite","version":"0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6","_integrity":"sha512-xdfNbPGldKa+OUydkb69b+qFYp/F3RtM3WTSpGaAgzfWUr8bAM/vkZe1OYTA6ZkjD7IGyZKXoo8g9f+gStME8A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-xdfNbPGldKa+OUydkb69b+qFYp/F3RtM3WTSpGaAgzfWUr8bAM/vkZe1OYTA6ZkjD7IGyZKXoo8g9f+gStME8A==","shasum":"e84e7fefa016107d2fb6d41085bff86a6217b48c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6.tgz","fileCount":117,"unpackedSize":193238,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVPl/AEvVQ1oRYlZtEYgR/oTZlAuiBLFG4B2M52HDfLAiBHuZti+cWlMoS9MwkBXyhISp7jhk2rmfvHig2LKjWV/Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl0TPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRiQ//Vr1qthwDhC9vDydMEBAusF4A/Bh1qDMMBgjlnJIw+KmJJv6e\r\nZYJNMxpImozKQHstf6IZjU70tZ7Wi9Q8O+NoPjLFu8p/xVkflFS6rT9hwZB0\r\nHO8KBlSZ8dLO9yk74St/sZA2at8di1F6F/tQ9suKoVINTyE2jLmE3ugpi4Dy\r\nsX0qsvdvQloAgLCgXNb09WR0R9q2icREsLnFaMw2V+AAH7fJfqPss+ip3xXC\r\nNh2OMLai52usTajrEErWcCF0/s/UbTU2a9waHBlfQ37iQ7qFgavODz9UyCJw\r\nlkazKHA/evwhXJXEOTECHrlra0v/5XM/vYszhW3BgHEV//vN3PpVfEfmuBdm\r\njRQPDmICD72p4Kg11iBaWaTf6zDabzOBRPwBBU+W67qRkDtj0hBTsATkp+D1\r\nGFD3OrcfKBimpmccexua/PWYFOQO+DNQ7cYrjofDc0PzCm/6BkNRdMo+G/oy\r\norj1//ukIT717u+dcx+AgBf3wm8pbZ7zCiyjTtkbLW+P14ebX+lhtlpTVhxy\r\nOblJFSXF4Kp4iO7li6MBTmuMcS7r0gV0Y0wSw65GeyiVsYMC9bFvkG3FjZ5D\r\nw2qV/GBm43s2vZyFv6mGuGqDuYNf1C7PIS1gwaKWI+/3GgPwsJ3QAuLSEOES\r\n9xrueSm24rdcvHIb6wr5+IFy22YDh6i8Xsg=\r\n=shKu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6_1670857935538_0.6464524672718523"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-7d422f2":{"name":"drizzle-orm-sqlite","version":"0.13.0-7d422f2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-7d422f2","_integrity":"sha512-qysnn293s6r7NFzHUwlTem38oQQtQjFNZJQaWbWhUsgXB8nRVJa/xj08tGxtN0rvjd+wqVW6DFIMDhNkZItrWg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-qysnn293s6r7NFzHUwlTem38oQQtQjFNZJQaWbWhUsgXB8nRVJa/xj08tGxtN0rvjd+wqVW6DFIMDhNkZItrWg==","shasum":"2bbba05d632b68f57156a2f7e158569b24d107db","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-7d422f2.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID29pzswxnjzW7DTCHwZutmx+ZkPsgCl4YYwenw0sat2AiEAhGkHR0wPTJtTFCGpquF0dnLJfpu6d9D5G1WfKuZZKxE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl0ewACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYUA/9G61woHA3qpIzuAJWFGNELkYpoLNmNou+9S0IP3RjEENJyZHg\r\nNbCrK15gw4O5k6rlEVTr94hWxZ2qhbW8ZpH/xGAmZnLYrCUwHW4rPjzy2L+t\r\nj/ngSFIJ4HsVwFhtb3KvU3ZAGJ+u0/y3gLFllLqn5DpKWTXiBPz0hGBR2+Qk\r\nsw408st0BoEKkTw40P83VabmM+ZunQ7/3DPLwT9rrmAtjlzhNYRxAgdzSDcf\r\nIeK2QOcMksOq0cl+Ov5P8GEV+nicF4blRZqu8LAsnYoOva4y3RP+YJWli5xi\r\n5EK0lX/2/N9NAVKmAfxa2ww5ru6ha7dZIRQ2121r6wAw/W22Lj/gr367aw3h\r\n3BYXvCBuIo6GVAbcY0cpLUn0aKKTJX4DiKzIHtHR3hZ0GGAkbTyAomVu/o+4\r\nLy9KobU21zYmmZNysJGOx1qSn0FZ4h3QhziqRrDqgSoNmOYFi1CXhecFjWi0\r\nao5O8Lkm/mCWX1/A12DQ0K/7hXDwWzQ5Bd+BYF2ugMPm73QkdOieHDPMOGuR\r\nu457voec6mvx+TVqiEYYRzkdFUb8qQ0/Rf6czJY/+eJ1eCDsX8/8isdL5Ukt\r\nfcNmcPDI+qBEyqXdf+GdEwrD5cSeMbd4kqQlyDGr3+FUrf2s+MRAokKQjp73\r\nbvtdb7DU711UEfKPwWHd6aMp9mgcv92DA8I=\r\n=+ghT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-7d422f2_1670858672045_0.6205358740865565"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-a61a883":{"name":"drizzle-orm-sqlite","version":"0.13.0-a61a883","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-a61a883","_integrity":"sha512-BqcV6Oqfi0C6Gyoon5XiK2UpYNL+J5/WTCcbzc59nt8BWQhqWS+56iVJogJbb8kQCCYKLnifSf2AKU2nX1U79Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-BqcV6Oqfi0C6Gyoon5XiK2UpYNL+J5/WTCcbzc59nt8BWQhqWS+56iVJogJbb8kQCCYKLnifSf2AKU2nX1U79Q==","shasum":"535a84c80193d15664100791376a49f051a629b6","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-a61a883.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHOx3SWtGZQF4AxIoI6qp7gdekNV5lcIGt3fnGmOm/OGAiAaKbD4p8lmjgm7iv++lZ1w+M3McR6tg+12B8gN7RjNHA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl028ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqIYhAAgHRCfW7VqyolDqGuGEek6KiS8ojQooY+aTvM++YEyZxdGcde\r\nUnEvMs/kI8tPrC9ZH9JP0aBqycMn04BbNvRTO8LTFUzLdoTrwaPjmAkP4eEV\r\nBtNDeOIl4RkPzBz1RBQZqb75tWg6fAwh7Ix9x7g2DSjRA/2KncNpyu+lrORu\r\nHtVRJBDl39UJx1wHsYTN8O5fgIRc7/DEFQUmYsJVWIzHUv2n/cry/PDxl1g9\r\nB9JV1w9VezP8nBI8GxdWVS7OXmJ2Wcyd2mNj2t0vxdK11P4y6HbgRfdaUR7Y\r\nE+vu5ZfFZHRe0X+038TheEB/G4NVa/6BEh84Rq0zJSAK/rrOgrDzEqMMQlx4\r\nBEkcrZ6BPHN8YQXs4KHfM1xpy8TRuuMDAbDDXuf3KJlEhAUQt43Zm5/zPUyI\r\n0YTd7nC/Y6CcIHAJZ3Z1DWm+7k65SlfASwSKzBCEUwBWa60Kk5cO5tjJGyUi\r\nnOSC/g7oAgtt5yTmVj5kB0Fzg89VCGwV/v9POHERLh0ealO0qHNhNdFm740P\r\nqSJnNFMMBg0tpXgwpW6Yf/4U2AlW0EGvvQVsKv0oW32dR8S0n2YcfqRnlBUH\r\nGNcYU3GNUyZ+tm2Fr6gnWAbC8pI/VNly0TPRxn7c8KAkNj0x+WY1ewFxiL3H\r\nYPhdjo+S426H+zCySrsUFMAW2AgxVAqnAcU=\r\n=HxvN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-a61a883_1670860220539_0.451906295118053"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-6a923f2":{"name":"drizzle-orm-sqlite","version":"0.13.0-6a923f2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-6a923f2","_integrity":"sha512-dG3dAPbxgpvgHxzg9Qz5POB6fYsdK6fKtLYwLGXb2G6ivfjqyMN9ceTWdWkhDx1Oi02AIehpKTfBJ8wTjyZlpg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-dG3dAPbxgpvgHxzg9Qz5POB6fYsdK6fKtLYwLGXb2G6ivfjqyMN9ceTWdWkhDx1Oi02AIehpKTfBJ8wTjyZlpg==","shasum":"bc9c143f52e9f856b18c360977efdf95aacc286c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-6a923f2.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFUhgUU4DpqRxJLUvsMFIHXAjuJQk1G05Zbs6YImAoeQAiBJDL7wJn8utgGPOpJa2EHVvZhyxypXCKPUQPpTHEKDew=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl058ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpr+RAAknljW1Wa060uF5LQV/yZ+XXu0rtfnsy+sNfzVsREaxyFe9Ia\r\nGLRz9F1vHmUGPO14MOJ6tWVgZ0y6uMuJK1eBgd5jJhDnfKr+BrWm4pkT3UOI\r\n0t+m3YjGgShBPqdUSPjWcksPlaBkyTF7jViT7uNeYiNkpt398WvTS9IMtRsg\r\n7oHYTMtrMzDtVVMhA+IqKd5BswUHfba1GFXcZhZeqEY3bgC6EBNPZXP5WPKO\r\nseh0O4QnqcHIcCWWMLRTsKvEsIqjovjt8EXFL7MFqOuDOY6CU1AAcZ1pfCtN\r\nHiSLVo6eHmZiJGn8YSBmGevfFIe9wf2WgBv3dwP0VFStSnJ+sl3Jbe0t4jwY\r\naJe0Qme9p1DbJshf3j9l4QGwngJrw6sgSeOPNvGRrbzYz1WtSNe4g9gBGCV4\r\nrkZ6z7SjI61Lkv0ZAkK7JiAnM1GTHpVNi2xF3r5jzGUJ/S6yNqNAh4sh1QRP\r\nxEhZ7j+G/H4t85FhHQEaw4zK7Wk8SSwbXeRwC18bqsvG1fpb4pJwGXbHrBsQ\r\n5Cs5WTZf4ls+Fr91VaxPQwpTUzttkb49xYcKoPagPUzVqFnJnc+Jgouv4Oa3\r\nEYs3YnpOaJEtosUNoMBxOz3wEVA3mC8ZHthmpm2rWjlVatOdmAoNA7ankxyD\r\nJhRDp2NyFTxRHj3L+p4ym3t48jP13bGniW0=\r\n=mudK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-6a923f2_1670860412352_0.17795403087078876"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-a7bfec3":{"name":"drizzle-orm-sqlite","version":"0.13.0-a7bfec3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-a7bfec3","_integrity":"sha512-ydQXsbE7NThSVHy9Lk5nZu1iZyDQQrQ4VE+aGji4BAKkhEVThFFpzndWDSoLJYhlYFf/TuDN4UtD5iiQ6OW5Og==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ydQXsbE7NThSVHy9Lk5nZu1iZyDQQrQ4VE+aGji4BAKkhEVThFFpzndWDSoLJYhlYFf/TuDN4UtD5iiQ6OW5Og==","shasum":"376c8897d1a1910578165300c00b7c18776aaf80","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-a7bfec3.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAPYgmWp609sHbIkcRurrt25Mblyngq8UHkZL3eBUWvGAiBERpD/HHovooxdj07TPrDj5cH7jMclduIwqncE7nSSqQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl2bSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqZtw//S/YnY8Ld5kX0NGaqaIuN2/dEpy/bRuufp9WoPRFdhbSssoUs\r\nkJK6ygcgpSCUvPHWUE93vCBimu/i3CwB+yjA6UmCVoqlnwXwWv1PlpBOHhg2\r\ny4CIIrC+p6CPp26i7Q2xyWu0MrZUtTd/J4Pfn86KxBzzxq2ZjKSe1TgCmC3s\r\njSh+dQMTI4IGHgs6yeqEYtzDJ4q2t27H9FQMF+Wk7LltdjnmWb0hLvOKwwCy\r\ngljGNaH0ErmiNmYnjTsyx6wg64R8q/VrQGbxubHvQvFdkwunnclDx9ELkOnF\r\nsBF7CrjuputVF7x0gNJbc7YKKv4Zj9l+JlOczjtOD/p+w1bw7YxpwOFQD1Qo\r\n5zpx7N6O2h9PgLBK15Yxut+KFDkzIr50uE+yPaErI0VNx3YUuLkQG/UrDfD8\r\ncHsDBIBngl0wmn9ftyiFuHbS/Dkt44YXWqQ0WltgZo8iEqvbAQG+GO9aaTts\r\n14ZkoKlDJsTQKlQnh/QgG9JlfEIz6h/JCNXnVp0eRjsydbdnQTKyFL5pYLZo\r\nts/4RIo24jv47Ijhv9+y06itnZAgBLUaBu8GK0yJqKKRIeMB9RSl3s/qAeDd\r\nU470KOhpjvbBGmlE9e0Mp+C5f0u/uyVbYK5f9oBx11edi5cMa8ieL5wT96ea\r\n8XhOidn5kEofZYC9v28M/cQP/GkGibVdWgs=\r\n=bLlr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-a7bfec3_1670866642085_0.9986445417430878"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-cd3f5e4":{"name":"drizzle-orm-sqlite","version":"0.13.0-cd3f5e4","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-cd3f5e4","_integrity":"sha512-42aifCHvjIPM8nNesLvMPk7oUunrns+SNVL8PFu/akYPbRtpJA+fuOWAD4KCkk1Wp3OVBvQZQhOFpt2yCJGWag==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-42aifCHvjIPM8nNesLvMPk7oUunrns+SNVL8PFu/akYPbRtpJA+fuOWAD4KCkk1Wp3OVBvQZQhOFpt2yCJGWag==","shasum":"20f8469308778cc3721f242055239a988207662b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-cd3f5e4.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhKcTqSEPJe7QCY+mdNb7G77kygjvrNXLQrC2EByVqVAIhAPnprQFgvY94sEFymyJ0Ax5lExtPlBHOekMgss2C9rQM"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFNAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCow/+PU/toETgVVjoiLRCjYyblmv/8XJs6B61svq3hdoNhhSDZkx8\r\nf7/HnWEC9bZC8D3Q6aQL/zqaGaZpIUHfwyhMEFYY1Rs1K1S3vKPufPtc9uwP\r\nzuPSr/JjMbd5jZLMrlKwi/0C27HZ+hpBzpq/d7kQa5FSHJ3uiZTwGbC9bnO+\r\nT35kSabrz4y+Mm2SxN5DacRnwCnEzk/p3+eJkE8SKT71YdHp7o61qEnqWRgB\r\n3c/eCny4R0hrSk01PxyuRBjTpoN4bVXfW3kRQWcms9rj2fHaen0Omr+FL63W\r\nbYXFAo98I8cUxkOKg64fLeqbAcio+Xd5qLT5iwb1RasTli8AXt/FQ+8N/kgH\r\n/ZL1MWXjL6nOUj+rYXGWu5weJIhJNls2zxtGl6dZJllNy0iC+GIdJDI4XgoD\r\ntYomVUfAfCpBUJ71ZA2pdrwSweqf//i8KYCvh2spIlzxU0Od/GEJcAV5PDQ6\r\nsifwqYo2hM9d/8AEfnuOgfY1Anu7yr56cl9DBekbj77FpZNgU2SSzDJCiJ8a\r\nUpu6GLyktcFxR6lRzXFPpxuR41BWDblviSB54F2ZF1fLmBqBhwg7vhmjkFry\r\nbNkwV/CI5ejdDhvNIsrY8BKEIjEX1UUFOjk7AUduuBTqnHX4lQCCc8g95cZo\r\nf0jNkaijmUpkvZRP9fUp9Mo09lzzR4YMaJQ=\r\n=th4O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-cd3f5e4_1670927168530_0.45385872039173414"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0":{"name":"drizzle-orm-sqlite","version":"0.14.0","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0","_integrity":"sha512-IO5ZdN0bQqmnc7CeOWL59rwxMi9YPSU+IVixmB+W0OZzy/d49F1HXF2ali7XS9YlI9TEMV1gdIe0EdXKu5b9pg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-IO5ZdN0bQqmnc7CeOWL59rwxMi9YPSU+IVixmB+W0OZzy/d49F1HXF2ali7XS9YlI9TEMV1gdIe0EdXKu5b9pg==","shasum":"9137b9f2bfe194f9b54eb958fb476f674792edde","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0.tgz","fileCount":117,"unpackedSize":193197,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBWGkOLo+EXZs7FwL/KRNDf8/m/0xIhCz3Jbr0o1L7jtAiEAyIq0p/BNCjSMcBciXFZMCZuw/7saRnWHgnvAGy2JGYQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFV8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpklg/+PLJpcJTuXlrmubff/y6qIJCOm2U1xv25TYSjfTf79rLQQQJ4\r\n/UxDlPSNI34UQykBaUtHDtCxavMHa0TTBAnLo4aj+bffL0rvCLngn3d7XN+F\r\no3QeThyt76/erNN7YipzKzRdB4s5PB3578oI005wcuwLh6qBJ4ab9olrMIRQ\r\nUG1TUqDl3B0x8FT+XhHlkM92m02nw6L3x2w8jDyT2MsqTjQSzu1m3M1PmGUy\r\nVGIfg7bd6zaKZxRPju4ay1Fyn4jwpfjphvxadva1I8gh7TQlvDpxyRMHvEW3\r\nlMcUs8WBSDXBj9yEWtOMYQkTmonZnqqVIHq/rrPpKWQeQXVQdKIJK+E0HEh0\r\n5c9AvruSiSfjsc65GzGn/r0Ut8wjrDu/CiESMscPAzauXoYykzlpM2h0/ool\r\nAvAY24ePW8OBgIuACPCVybIIuE5CYpft9Yhgrg9xgeELWDDKT5SA7QROay1V\r\nTWMI1dl38GYllPDjBzIqidzeNDesobTMdhXcccmJdsAMMj1BFmsgCVJFxFKo\r\nTpVJ21meJkwLjaaikGvsWI8kkaiSCb6jN7pgGUv4R5Fe8H7l/NqhI0YhQA+u\r\nyeHhMuGw5DVLinca/jmXimNK09yzD7Zh6ZpzXkJcGbeuFQppImVibHjC/gv2\r\nogkbNoZUwjHXLEUjGvGyH5fX9ziPUVyul3Q=\r\n=Lty6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0_1670927740300_0.15509835684231787"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.1-44e9f79":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.1-44e9f79","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.1-44e9f79","_integrity":"sha512-OHGkvaH9aWq1eLhYyfDwLwOREqYemFqDoj2E6KRh8LGUJti8+stR+4WXuxh2Qs4VYA99p3irC4fZTSpY6lVnVA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OHGkvaH9aWq1eLhYyfDwLwOREqYemFqDoj2E6KRh8LGUJti8+stR+4WXuxh2Qs4VYA99p3irC4fZTSpY6lVnVA==","shasum":"a0c6c9e6cac11a5df63bed08baee2865678afdf4","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.1-44e9f79.tgz","fileCount":117,"unpackedSize":193347,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBoGlw9xfbLLc2fswg5ikIZXwr2HjuMhQ2yxQLFw4b57AiA/B7zIUJKYonNR6x4PDMvdTjReiDVHqp2Outdr3BIfvg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFh1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp/yA/8DMZPGqMBqQacMkBAJpWQNWi9R72Jz8bZkRQmdZlAyxPBSxiE\r\n1zFXLu2QVNAlRvb7IjjhwsRLG6GZgMss1H38pC623YTqITunicVIZPsPxwaD\r\nyAvrNV5xj0cm9YmdxyIfzTFXtTsnK39rarOXgNkfVBYZYAiX4jnmFusgtJ6N\r\nOnBnuWvlNhjOOGHUtjiVaL7p7ez+w1Jzd9egXjEzNB03tALxBZRqj6pBkfI7\r\n2amx/0cfNykODyLSWswtRj6kGz50NqPZI1UhQFFCT+Q3URhU/vFZvNQIqpPW\r\nqaCtvUpZIHlYKYUzVoW4pnTpnqOQjwcI7LU8VODCgebr/hiuMm2SNiweCQTY\r\nFPPu+TxOE/9SchAr7WkEHKMs3u8/B8Hae32x2BIhq6GeUJ3wAeBt/H5ebrZv\r\npyzGWJve9fEMbYR5708c+/UBpA6O0Bip1V09dqf/23JSNu7NeD8f3FmPXpGg\r\nh7m6NUwCWfpYIcwCHkM5EckXa/BadMxaA86WB1kqC7TInh5l4zhKgLJajQ3x\r\nXV28baeAewwibKVlV7JwNZ+lVoAMG7JEoVrq4Uh6asY4CLQzRNfp7nKaPjlP\r\nTgaUW78+OhhJdZ10MZzyutcKp+/Z8rYCp1txluzI2TBfwvUuA8K1frXTTROR\r\n6Pj6JIVeAvW/xvPloSjOvE7RO1v5tdAoiDU=\r\n=BlDI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.1-44e9f79_1670928501488_0.4122835920666801"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.1":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.1","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.1","_integrity":"sha512-kFKVaIz+0ZY8DNsjXT2swjxurQGhGoACy7wU9s6qJfyp9WVCXm82JvizDYtajVTDSToCyUNImQOHbVcCQwIhLg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-kFKVaIz+0ZY8DNsjXT2swjxurQGhGoACy7wU9s6qJfyp9WVCXm82JvizDYtajVTDSToCyUNImQOHbVcCQwIhLg==","shasum":"92143c49530318863ae69abc03e315bd6713d3fd","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.1.tgz","fileCount":117,"unpackedSize":193339,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbagdllpG64TEbskFLp0fcB1isr3/WwpawFKl7ipDHcAIhAJpUVkZ2quUnGkJla3OkRW6BkzqZlbA8j9mXnnVAkjeG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmFiKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqTIQ/+MMZcjeULfn4KRlrOWsWENoPCyc3CY24Xe/GdOk8A7UIbTU9W\r\nUDe8f+fp3Hjy5kcYgwnDQruad4M7SjC3RXRFhQQFGGUj34YbBaGR6dhGT6kO\r\nmb1K5QiubFnyuPwwnIxjftEhwrtrnwMIGzCEStdG/qC4NiQJs06qOulJHlvQ\r\nTJbU8H9ZVZk5/VR9zfx7pe5P5gT5sUXRL2wh996MuAUQqtl2d/uCCLtynJdS\r\niMMOLn1eBYQCgpqrTEkNcHAerVNiQsU7zmtZlyPM3qJvKagIfFY4/bg3seu0\r\nGXH3uXnO+TU0kOfb6fZ87zyUCHIwGvVRo/emJeVcvO8vzz4x9UFcUmDtIln6\r\nN+p6PjWU9zgAGwMNNkGu0ewCU6tAK8TrHQo6UapoCh/wQ1Gd7LWouHGRVi9W\r\nBie2smF4FjoXKzSpHezmKhtsw8GEI8kScJl+LXI5UvkxAe0u6DGOsNo4GU94\r\nwUX+ANFQDgYghzKsPX7/S+FhM4X0CtoqSKkoD6zFgKZRY2sUnLiPAkjOOyOt\r\nvBrLt3IHTj6JX4xv5phLB8nFtvxRo8Uc8KFFWXe26EarezajKN7AOnFGaKOO\r\nBqfo9g2oJ+5FEGlqKzJDredfG6ij3kACW5lMnZ+BXbue1dJ5CJ4LZnH78W+C\r\nB98mp7Y6+rbKqPpnc11q7oiR9tJfLRa2/kE=\r\n=kWlJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.1_1670928521926_0.07905909099221464"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-f67992c":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-f67992c","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-f67992c","_integrity":"sha512-TDhjQ093wrbzj95L9xH9aM0v5HY72/Jh64phNGEyjeCq74puGNc5NUr9ibRd/bmG7p91VV5uPq/TwkR+Dgy9aw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-TDhjQ093wrbzj95L9xH9aM0v5HY72/Jh64phNGEyjeCq74puGNc5NUr9ibRd/bmG7p91VV5uPq/TwkR+Dgy9aw==","shasum":"f2ef20fed21f8019cd08bb77a93ac252b6e2c163","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-f67992c.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3sxA7sXlko0vwfY/1kfnjksvjmaBuW2YEqr+zYlbcWAIgKhOEA8BPhYloBk5kIMuJfKX/EQCpUSIqaaqrLigSUdc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmG8dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmochw//ZY9ttgjeX39tJGN5fMhtSDQtbA5bngrbqtcued8Cs9HCTHRm\r\nOXRTjnlKotWgJlR1eMaRRdSrG26OvTxzbqBBgc2geqiEnRabf65UOVy0AdrX\r\n4gXWsmYACc4QE4/jaFAz/72ZCn1uXDqIp1iB7Gh2U+v1lTgUVmVUVlhUdfEN\r\nzCRUfXHjFM4XKMdjnUylAmhjiEV6qISUsEM0uHutH958los6xESo6X28UNrt\r\n4OpxuEcxvuwSzV3DWa6ODsRP471OqQHUTRWPaeBiX9wgEaEF/FOuyuqhxR4l\r\nkmrTNXkrUJ33B99SUrgC6nMKyfhafQidm3aiuISeqaxLC+uOaf+94reK0hEy\r\nTBXDZLCB4XoKkMNZuIl+u/98/DqFdZiQnjiczWBeTb9+tKcHPie3F95HZdAP\r\naRa6VFEuUfSM4HAbAB5e8kOaNR0/n1ae3Q9ZwBUypgmzs1RXdvU2sKziIxve\r\nocw5PuYr6LFiAOukawfUru7Tfpt5OCmC+RxU1ow8BVV7q8AktxF8sDkLWAGm\r\neppGtJCnVsKAOXt0Z4XEzaT6qtsIKuWqE6WA5gy7TOrEudk6sydo/GunhDUU\r\ncjT/4S2xPXFqFz+5UNqEqLr91OkCqxr9D0Jrh0oHhEHlWvrUepzIr0yMONyZ\r\nKQPGjLWRUhdO2z7axTNan48eqaBVyPwa+gM=\r\n=NSRV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-f67992c_1670934301369_0.396032072241417"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2","_integrity":"sha512-6Db1FSSOHP3haS9odfsx5QzKV8K++WodUWrZprD82CMYjT9FdLct3ZaKxO+0Fn3HVsZqM8r0z+ynKzHSYtaONA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-6Db1FSSOHP3haS9odfsx5QzKV8K++WodUWrZprD82CMYjT9FdLct3ZaKxO+0Fn3HVsZqM8r0z+ynKzHSYtaONA==","shasum":"9662120b53bbafb95c4153f4a9c4010f6230e810","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2.tgz","fileCount":117,"unpackedSize":187722,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDy4HlgNE7thfv/BTVnv0lb9i0CqGqFlr8U1of9qySM7wIgPZi5qr2NcnZUcvBvtOpu6olNCgTs7uBmtf5b4JC4uI4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmG9hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmodLxAAh75eLqHxQWSEISjA5SmH/NJXB7lx1Xo+Gj2KYDgKi2lI6vSO\r\n5o56mtvzSWut2EwC2J5o7SEEJWgzst3wrCzxm3W27ur4RiQgT0D5SMn+m7dA\r\n1NnKlOgtWgIcirqaRqyL2AQPACpTivHvLm1/ZEtUVZ7kGqihYsTvesZPDVu5\r\n0YXbU4d/V8PY0DOfr+MwaJJryUm+RvyzFORu14JDELxwaWVfXnZO4X0KIaQ5\r\nAlvIUsydH4DIbe5SwFgvbuf9ftvNK5OMQiHjobTvD895VseOygyOTu3UVG8T\r\naxkBLoPaiPUoT6ToiNCZfz8Pyg8YPr19cyhUh6wJaPVOQL5uYz/lzbtHm99A\r\nkSgPy9oqn0LcxRAqgICAWBWizLxg11JQFViIXeK83EZzcTqzbJJ6ehCSMCdL\r\nlRTe4J6QZ1FtjLaiytDfPttn6wAEBBTXouA5d8pKj4gtzIWQffflVfWh5Mos\r\nU8OE17yWQwnMce+M/GpHeKA+Sv4Z3dVc9HwssOY+yoaXiZ2UIAaGMo90wqsP\r\nw4PHg+lW5RvFjMnniGbp+SDVvZ5XG53vRoFOhtaAuFOGbp6CmGxoljnYA8P5\r\nm/VkaN/Z4GkSCQySV40n0Ci2thg2WSMCrQNP/SGSVQmJSWXxxXvKKX0JP/VJ\r\nTla6y5Iqc9Plrqs0eaV9CIbPdY3rKabshTo=\r\n=Q9/+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2_1670934369599_0.6719065066790839"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-a4036d1":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-a4036d1","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-a4036d1","_integrity":"sha512-ma7wSdjvrj8JV6kX1xYlaasq6oCV+lnQD5JyZvSjGPAHKBoDqDQGna68NhBvq+poVrPS6Y++e4vSZ7lp5HCdrg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ma7wSdjvrj8JV6kX1xYlaasq6oCV+lnQD5JyZvSjGPAHKBoDqDQGna68NhBvq+poVrPS6Y++e4vSZ7lp5HCdrg==","shasum":"8d8d3d521340f65a1070de4bb744d935f1c156a3","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-a4036d1.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBHJEB+kNih96j0RL7yodcg/ybHaTG7ID4fkKZT3YhnzAiEAk7hGbNbhoIQkw1j96bag17Go3VdWhCwhCb/syP+svaw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJx1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrNNA//fN/xfc+Az2u4FNqZeDXQMqogxokZUklDeOcs2isjxhxhnBr5\r\nmuLYD1i5W9beVksK+qwnjETOP7W7H9tVN9TaJVuHzO1p+EYFjR1JYMc22Sac\r\n+XrtQDKMJ2lZuI5q74r1IPtC0K1Al/ud3bOTpXt1by7o9n8conNr6/aBOef+\r\nvJsq4zYLwhKGpsmOKaGuh2M/sEYQAemA2Y49nFTytYN3JwwRUVvjXLQ4c8Fu\r\nOpq7NbeIFr3v+phGvtqzmkxCIL4YUtOq8gTlvz0dJVTjJX01kA6cW3XJsFax\r\nljK33AC+B84VDViP34Kv2nVlTdXOzRsZKYiOSkDW9KZjNB9W7aXz6nQ2MZhh\r\nmkdXs9IFCfP6joxIkgIlb1pzEWeEN2YIRxz9I34Y2hsT/NGGOm/2NToMtIIA\r\nkFtAHCMWV52DLcQb7TzLGKpOoZT8YBCSd/tAIr9IX7zLOviJavn5V/+D7ad6\r\nq4VRw5n6rWo+9pRI0Lou9LldNaaI48o3lGj/YECtRL0XLombwHTn5BfWxeEO\r\nSAtLJqP/wDvhtATbSo6DdGeNdAZ6nShp1cSQfwrri25CzrKj07u2z00Re2qy\r\nigOOgc5BM8mO6fC3Kj8rbuyhvKx1uMuVDnIkp9J/q0nL2frT/iPuVb4GEpt2\r\nxS84b8v70NOySCKSdXiT1/7Xq3u410xRiMo=\r\n=kHuS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-a4036d1_1670945908998_0.7597757837510752"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-29bad0a":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-29bad0a","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-29bad0a","_integrity":"sha512-Py+umqXjKAppXsnHPiIvshulqUACbqhDv3kXzHyhcM/zblg9FaVlJi4OEaYsqkcGfiyUeP8zPhhXKUBdt/BtEg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Py+umqXjKAppXsnHPiIvshulqUACbqhDv3kXzHyhcM/zblg9FaVlJi4OEaYsqkcGfiyUeP8zPhhXKUBdt/BtEg==","shasum":"b13aacc9052f115688a82675f93687a7d050cc63","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-29bad0a.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDeTvEiH9cp6/MLM2VLQnpow7dWtVOdbbgUaoc5TYXHuwIhAOvMcc+WjmAgKihFjAeFMHZUCLMcCjA4hs5szKt14N0v"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJz2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpTOA//YJmRYGYUBXTLlVPA/puNb89r8XwtkEycMkAcbVhL0S2gbf4k\r\nQQyfC2O+YuFYlCft5N+iiJRhqA0X9/k7QP4tyACyUicTOlBBOMxEOKaImITL\r\nYFLRTe/wqqDcV2GBtd+oy0epVh5/PY+A9+MOx9ksgvrKbnNlph9m9AA5Tq4r\r\n6ObP9rh6tKASav/ND9jCu+EBvUfocoO2ZKgkb3xlCYuEhaE42gy/9F5KBZat\r\nimSkD5Rh+fWOaf3ZlUZhCRU0+6kns/5PDzDrKgMYvHJndx760d1tlkOtg7QT\r\nUIUkGhkfEbHI+XoBRjQneHHnLrvq5UORi/D4nCq9HkRDsyyD3LKVU6pjRS1a\r\nXGak2a5ez61OZPcc8nQK7FL0jDc5DqNxhIhWyhiBBfShwA/o+nwE+d6tyv0c\r\nbYWft12XTKgJikZZb0hMX+cCgwxrxB1Gmva4gUqP58G+BODE7I94MfyNds35\r\nuocDv7V4SNxR3biaxvleO3Gd4FZe+eFE/rVMBbH2lpCWWXQQKENIazXIs6ZX\r\n5TZ2RKHsiVrmd+ZlzH4mnyWAO5YtmjlyUiyNmeieRN56ZmzMRUuFa8cnw2EF\r\nAEOxCwbmRIkdiar6vM7KfNHWtn3HqJWPsm2NRnEUEn9hczeMnbe0VRUBWDsr\r\n6zql4WPFeK/dfjeMfcPXLgBds91gE2+e0yg=\r\n=7j0+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-29bad0a_1670946038698_0.1490098044374093"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-97a60e2":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-97a60e2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-97a60e2","_integrity":"sha512-jsfDpPLfMztdZxGFv73vEE1hWGaMjyLWAeAdwSUBxITbimYj5Hk+BQIzZ3aqZj+XgDpUoimRAUPdnoNDNEZaKg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-jsfDpPLfMztdZxGFv73vEE1hWGaMjyLWAeAdwSUBxITbimYj5Hk+BQIzZ3aqZj+XgDpUoimRAUPdnoNDNEZaKg==","shasum":"6482017d748427f32c045caa903199c624647596","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-97a60e2.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBUY4ELvRcDW1OFJJS3F/98RRap/+qcqbLyWMiy/B5McAiEAn/7ic4uVv3F2A8SJVFoSmvj/XRkLEGjRRHIsQIqviDo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJ32ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+TA/+O93ZFRPsciSIcNK7WegeJRKcgPy3APQdqZPyW3oH+UzJ49iM\r\nf0cRjeLXn44u9zITNKONRMsF0JYQXqQHLFgFJS+zWist94DdKepp8G6RuUGr\r\n/zt82gY4GY07N7YyOW+U7yqMsFuyKg84HqJONw8PrAwiBIGaJkxLo7j1N3Vz\r\nP7inB2CjbtgdIaJLDYO25SJ6ij5gbX4lAy5fUUXF5FzJ46yTF/nGcIpU6+3r\r\n0ZVwf1JJCHw3wV2lxpp4QH0/nJp1s9Cn+hYSk8bQdlSW65alzf0CrbqWHZMT\r\nBsZPg6C2uqckF6nesxjYQOHBqoZ3mseQu+fHSC2YyDQ45gUGZg8Fy+ooq+Rl\r\nsxfx54TySGHb/8Bbf8rxl02Qp9vydnsKPAJQFSQtgdGmr8uTEcDw1oPbHetN\r\nRHcUXDq6xaoOx3fhlM7OhFW04I21nnh640rJ8HOWtYZt5W9fjBT9M6MpsRlK\r\nJAtrhWfFHhloCiWNnWn6opTmKli84XP3BSdwsqA2cwhY0kPlWNFuwoi0tUc6\r\n8ux9NtRHDFHL5B2mH+7XUsTj3yFzAz7LzfAIZJMuMOKHml7nSA8m/IqiGA8J\r\nw+w12l6xaPFReOo4MYjETK+288AYK2pyhcuUtuvn1zH18nBx0QZYRLlIQeWE\r\n2kCrOW1wo5NcIlSJrhWYjN9Wnfh70DqqN3I=\r\n=Qn+7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-97a60e2_1670946294113_0.25308134695184803"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-a35bf74":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-a35bf74","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-a35bf74","_integrity":"sha512-J0eKmltKJYW14Dr3z7U5zBwNfGZOBjOrfmTwzfss0JKBS+NZQ/LgPEWGB2g2BW5DLOxea3/hKZwngDf72hVuIQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-J0eKmltKJYW14Dr3z7U5zBwNfGZOBjOrfmTwzfss0JKBS+NZQ/LgPEWGB2g2BW5DLOxea3/hKZwngDf72hVuIQ==","shasum":"0bc6587e09d491c43d6718499f2def2c5774a43d","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-a35bf74.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+DhRMXZBP6H3GgYwMuKC+m2+cQE2ig/U7FZZDimU14AiA4bI3nPsBaKCba0B2dcvp7PzHK4x9YbmbkP4C7PzRj3g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmJ7aACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpM3w/9HTW1b/oHPt014alcymggYdldDmvgFKa6R/HTDOrfM3RrKWIL\r\nE6N3GEQQ+keyJ+c2eSzKQN1pkpilNoe7yemclCJPWIRwOrWdf8w30cp25hCF\r\nYSsP8fv2OF6RgOmOwcc/1lufsIVFGk4NM4l1xzrclaK74+maNdRYnEyubFdY\r\nvZHqD3IWZqJqdv4HUS3Pkxgvakuf6HGvO6ohgaVcwo+eLq1QeUSr07Li4y1x\r\nFmFASn7rG2/ig/LCfe1fl4uJ31PtxLo2i8A1EdvkF9Ta8XUdceVSlOGCQlC/\r\nGKeLbbAyxhjUf6LH+bns2IGE9UpoVA4iBOk9RvF7IPfEsc6tsPvp9r0ROSBs\r\nUFlC55/Y9KbQ+ds+P3Sroe8tD+ABRJ7m3TF7WO0u06bx35Sf5Ohi4og6tC+i\r\nwy5dfseg/ndYMs/j/1n0v9edUwROg31lUhtmAccVw6VDjAfpTsqwzrGNxH5v\r\nsPJ5Eb/vH7DuPQz8/KWhfEF25+lBWfOob/zpZs6ftGXaqeniv0hz99BHOrjU\r\nWyyRi5VhNx2xk3Sqs0FkXW7SBK1jATehKY9GhckQRJf9mKIeuMN/fDQa1xlr\r\nru50p5JIVozT08F6evPv/qibq/51Lfw13321W8rQkZ4E2Ngc3N4vbSAhqw7v\r\nmoncLEJj8zjkzZ2uCz1zSUcRYDhaeWHTiQE=\r\n=MxlT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-a35bf74_1670946522440_0.7539288423201926"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.0-beta.2-502278b":{"name":"drizzle-orm-sqlite","version":"0.14.0-beta.2-502278b","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.0-beta.2-502278b","_integrity":"sha512-/KEvEf9iO+j3NoJdwLZ3UafLhhUdrNx7mALJWmXC2SYwvjDgN/dRGzstiMaaoEA2aSbOhrtFQe/9iEIcvKvGkA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/KEvEf9iO+j3NoJdwLZ3UafLhhUdrNx7mALJWmXC2SYwvjDgN/dRGzstiMaaoEA2aSbOhrtFQe/9iEIcvKvGkA==","shasum":"d438ba9d7c9c024710f9d36aec15567f16cbde02","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.0-beta.2-502278b.tgz","fileCount":117,"unpackedSize":187730,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDrXaCQ0OlLBITVLGR0S+TbULG3iuzWlRyrkfiL86gQgIhALp32iAbdzwoVGnZ2Oj9gB8MGCgmaKojP2QjpQcLi088"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmbyaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1dRAAmxq2iKtfW9yJX5r9gJK4NPhI875ZSvyWBQD4yyce/ID7zfWJ\r\n8yBOQQlqRqPy2hT+eADf1XjW54rXVOJ6Y7EFwfpz9tox4zOUw22F97mK2NH+\r\nN1MamHO0Hlz5eSD3hfNkdlYCcCrzVpH9vsc93Y99gcB+qQLzZf7cG11lzkK6\r\ndi4TCJeCC9Pu5z9efwjH8kzMGjr40p/QpXdvgNRlaU9ioYTcP0RUhLxJxcc3\r\nf3GAAS9D6Q1kjFd7iknvdWkIKrh6eTs/xNYI/rauhgPNKTiQG71jESzUhcF6\r\n54/RP2PFZY7L9/424h7hCjl1shhJruJGA8AtJVPMXiiOu2DcarVJnRpt99zl\r\nbXTN1H8BzRI6p75GU1DElJBtIb2gXKeFnK8yhcpwB7RNS8o5Bj8+m+wYUSD4\r\noVa8dIuIfViC0020A6ukEELmCpXTaMP6xsrHNRC5rdkci94zcPMDW6BSgx0A\r\ng4FHhMMUK19oKYFlLvxvRgpyQs2OkpU5ktgUMMx54zqbShB9av6+pXeq0vjl\r\nHgf0GAV2MdPCqTJb5CAu+DryBOEvQ3bLfLJWfBbmV8VupEdzce1LmNiyUKcQ\r\n77ckCqIbEFcT8V7PfpyFuSJ35lIZBK+O2Ul0AH0ivXFGV9a+lOj45ld8cKJX\r\nVhEC07ye0+5WEEVYoDJ4fcDJmpsKrQ6uU8g=\r\n=PgsE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.0-beta.2-502278b_1671019674466_0.19086729593271112"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-efa4dda":{"name":"drizzle-orm-sqlite","version":"0.13.0-efa4dda","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-efa4dda","_integrity":"sha512-xz2oEL8hb6JyIPd68vulxL7oYz8ZOhwVtIzTM0HxINSu7fg3LhXMCmaV3nw1tiHYTjE+raZlzJ1/TMShM3ewvg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-xz2oEL8hb6JyIPd68vulxL7oYz8ZOhwVtIzTM0HxINSu7fg3LhXMCmaV3nw1tiHYTjE+raZlzJ1/TMShM3ewvg==","shasum":"6cb02096cd49c96a9e6846bbfe9e033a109260e9","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-efa4dda.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmIovNDaNc9ZfRpi6LTdIIKVYGliJ44Tujbi81r/EwIwIhAJXUiBCYTS3WNrlUXhL8Dh25Qt0HdNUkMO0uvWdqy0qr"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwkCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmre9Q/+Man2BgCT3ipJVOA1sMOC1q3l6PCAe+d16bGb6goPweaVOegu\r\nVtg/9UsA6fGWLoZbqRkenCKEeUjnuUGL/Iyq8dhMri2pecQXmDwAyzo5uHtY\r\n9qN2JZu3vI9jzIbmcXWjahnb8lr2dSU7o8F3VoW8KszOwIUgdIeGa2AfcfKS\r\nfpT5IIj3VWMbF0AbdFAjy39PrGIOFzA4LCmi0/c7vVGaSYTKI/tcXFIsZSlA\r\nKBL6m+WM8z9TMlzqr/AeIYlNMMrkPtJqnXrjDs4PSav1xfVyMgDUdP9X83rk\r\n3Htkj5YvbSbvh93R5S5r+tcYf7s3FDgy5N2A4PFHxXwxbalnbwqZ2bXEPPHY\r\nyugm4YXuzdQx8C6zN027vYVYJ9664Zg3qMx3PYM4KyezUSdXwt9l4sCGNyNo\r\n+r0U0DssLzJQZmVHuh5x9HfuLz3ViQhUKD7dZVhBZYt6ae22pH/M3si5enbl\r\nhQ7Qoe6hj9srmDom+kN7YTyhS4jOK5AlLWq183fEtsDYNc5eNT36Nvx7p9fp\r\nZ72zp3GSmmTUAzSCdcCbolOxaio/wNbLlLqccsvZKNaC0T+LMW/mATh6w/tW\r\nXmbyBA2UKXLgRPVItDe1R0zKvthxUfYlhksr+ti0t6Tl7HeX6Nvh9Bfv8vT+\r\niL1iCM4NUAOU6dPNNorrV1P8J4uVlDjW0+E=\r\n=nshz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-efa4dda_1671104770599_0.6649602315366547"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-f115120":{"name":"drizzle-orm-sqlite","version":"0.13.0-f115120","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-f115120","_integrity":"sha512-D+eG9+9I9cpVGewQ2Nnp5GVup6A2D2L7k+LeIw5AQReUG/6Hw92zEzVrxKDyX7MOT6SgTofvnpeoJ03U9rH9+Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-D+eG9+9I9cpVGewQ2Nnp5GVup6A2D2L7k+LeIw5AQReUG/6Hw92zEzVrxKDyX7MOT6SgTofvnpeoJ03U9rH9+Q==","shasum":"48e0103d9b5973778aed76bca65728be8d191d98","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-f115120.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD42CGs8aVBlL+vXPAYge2CdBAkcQe6mSyblLshjRtBCwIhAKMUdeVRan+FA/FjH0k4rlek0nghBwqgXIrtuFwqwLQR"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwoQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr19A//f+pCyoxXu+baq9DAgm23RGAc430ojSHMu/H/HsdKRGVE+ZdL\r\naIiz6ILvy+zW4u5tZQHCPNLngU8yg4QYwwWOWIXxv9r1hfPZzX8Cfps+kN4H\r\ntUu675g3rY2waG0lQ3PQVfzVo8D09MgmcvBacijx/v62zEZWBsNWB3h0JeWm\r\n+gZpiwa/boLvWoYP40oD23lR/JnEJxKZ1t08CfWSIH4dwIBePr/apWCAWr1R\r\nVBIW5/szkArs6i+MGXHMF0O3cKVGdpHUh+s2ox7vcgQ7AICsWrNN3Z+kr3v5\r\nPsg58mqRl+wae3dWu931AvUZq0uEhm3EYtG1fmgc+Xtf06E5CSn/jDHrTj9O\r\n4S+YActwvW0fzGc5QE6GI1LyvBsH4j62GkOAYswm3YKSIIYj7cXUpVfQODdZ\r\n3AqtWBE7e94S3/lQ44c+OAZy9qAhrOFjDMXuU2r4zrIw68H81YNJpU+xXw3i\r\naZy8WfMaHdb0snNvST/c4to6bqsvTZlKVdf0hKLCPuEWbnzfVRw23Un805d0\r\ny6JWAuYcqzuWqo/SxkZsszjRrs/ycUsDqXKbJ3Hvv6A4/Y46zagpC1ABkRtg\r\nDPsEbvpGG9+PH6T6OZl00B11V8Xxvv3yeoqnaA873qgifc6f6bx/jsI97jpG\r\nbF81IlRdGhim+5GE9+NpZ0gpk9hxxS4aLLk=\r\n=pomB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-f115120_1671105040700_0.09252552365501865"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-03f651b":{"name":"drizzle-orm-sqlite","version":"0.13.0-03f651b","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-03f651b","_integrity":"sha512-h2Y6TeiJkFMxa6A5lRMGg+4ILMsJFWCS7h2hShLKzIi5TybCYAFXCtRLJV6BUAmvNPgK5rkfilH1m0ivDnd1Iw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-h2Y6TeiJkFMxa6A5lRMGg+4ILMsJFWCS7h2hShLKzIi5TybCYAFXCtRLJV6BUAmvNPgK5rkfilH1m0ivDnd1Iw==","shasum":"72c327c475b577fbb0a272d4113aa2f481408960","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-03f651b.tgz","fileCount":117,"unpackedSize":193205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwzGRCBKEGjS5AIWYVYG8KZG7DDlH8OkK0eYkOjVKpPQIgI8Q6Rln5A+1tyWYsgJvkz5srVgRSXToExv4bDpS+qqg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmwwCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonpxAAjAqY+5qVU7sahfOrdg/XTY3kwXxm9WARpvYGo4wVyAmCcGJx\r\nh75DHMtuI/BuInmBOexb/dPhdS+p7TZxgUpmpcC4vqIKSZOHcbCxISVuIQ3Q\r\n+1UvAB+xF7i59NrZ0VwTY3ip6wSc/EupmZ1fDBMcPLUC/SWrYKI1smiyRA8m\r\nHZOBVM3TKVvh+uVcqsVPqHH3JfowQUYo9h/yOsueCwCMAI+C1evODQE5slW8\r\nn8ArTGvUiHBZCWGlCDGhNOrlbGVM3+Ewkzsv7LsXPYo6QZqlolOndRH/pkj5\r\nXVAGR5nbj45te8T4lUchNZX/QnwSw/D+gbbMi8lPTC1pHRLNhwsW+I6MgiEi\r\ndtNS/L28rvDBIFUa0BPrXaoJBpQMo+QfoUuyn2791gBPA1xyWlbipwbpLb20\r\nmign82As0Kx8i/+tDa+Osgv006hYoLdEZolZf2rJ+MmYbPIKr6ztemDhbm/C\r\nHyF9XiSA6850Fz9Bw3bHztFI59u7LMIqcOSCZvapLo/C2RhIqvqHzef16AKQ\r\nG2ZoScXnXdsOhh0yfNZxYHPWRHYVKt4Y+WZ7jNxVh/jNSlNJebzQ1zgukuqx\r\n+hMn8sfBAbaWY/7Qa0pAhYpIerBbtB5ZrwycG+xFxKDjY4hQra/qgxYY/myK\r\nfiXR24Ey+StwCfJKsL1OlMLZnKztaJFNb/w=\r\n=62uw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-03f651b_1671105538331_0.4176549049152578"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1":{"name":"drizzle-orm-sqlite","version":"0.14.1","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.14.1","_integrity":"sha512-/vJTvsWSjcsz8b8/c9F6HKjQ8EUM2T8gJe9Ffmk+R8m7Vc06WWXSsPCpwgzU0ioUgFq9RG6UwOP26bcr7LY/Lg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/vJTvsWSjcsz8b8/c9F6HKjQ8EUM2T8gJe9Ffmk+R8m7Vc06WWXSsPCpwgzU0ioUgFq9RG6UwOP26bcr7LY/Lg==","shasum":"f14f26e1bae368357b0b5a8f4509cedf3507132b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1.tgz","fileCount":117,"unpackedSize":187715,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA8lpyLE4CeDS32As5hKFfJUz8QL62Q1xH6E8fDItT60AiEA2Y5rHYu0Z8ggWrn5Zh+TMrlbF3xnRe2wUUyHdwwhQyQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmyoXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqF7g//QSF1S0XFFmeFu1Q3u1tNKqgxGfFmzH+IjDkK7acEwG/9sUvn\r\n28z3nYy5w7+S0ubTfetQsWtBlPh7CueOznzKHEyasqSlpNUVKcTQNk38HUr+\r\n8jCA9jHYwbl6AydKzdzu4U09NQx9lH14Sl7PhPevAkTUccrJ8mE+EhMJK/Ay\r\nKqZLO8gtF6MfSwfV8o3wEH76ymroHWaB8DB02Z5jmuRIRNtKFsp6zGCoq3To\r\nA8A+sTsFx3Ifg3E41n2Z7xcXhueVDtn3MRBpqEfFBMh4y4zoBAsPfK0tqnQ9\r\nEu8gsgAYjNhpL/xvdZxZ2kEphzcVCMWtSPFaEH1HLUniwX7ZpSvlhiMrQNqt\r\ntHhz981cGonpOlemfD/Sns5rM+ZFqmad8Nq/aGoL/8aJSr3JfDvnFXfCe3Cp\r\njC/wmeRWfrxclZWZcjRvhJzTif3hQ+va76RFqzhRn52D1+41uia0hzVeYHEE\r\niihBt5kAoKd9SqdSRRFMKbuwTpoXvm4EogssQikBQHwcgjkCWVqEALJfLEys\r\n2RaE6ATOk3SkqJ1eXEvpjCZpNzcAFTVOgGZhAt/DQtvdDBdUwwYCrgynpPWX\r\nC4GxrDK68vWMF5qXU69pBVxzpfU2lDcJB9tYii0lbcy7rC/8Mz/6/nMhwQmW\r\nrFBU+QEVPBAejsDvVXvzVnzFCzO6vPkk5HI=\r\n=idK/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1_1671113239777_0.9738012131569858"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-bad61c5":{"name":"drizzle-orm-sqlite","version":"0.14.1-bad61c5","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-bad61c5","_integrity":"sha512-BnNguFTsLzivkF4tQSolT0eAplXOmT9UVXYEjrhaCsHdETW1Amh1/gX01dZ3CUpZfHz+8JuYU03n2hU8yJh8SQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-BnNguFTsLzivkF4tQSolT0eAplXOmT9UVXYEjrhaCsHdETW1Amh1/gX01dZ3CUpZfHz+8JuYU03n2hU8yJh8SQ==","shasum":"7d7373f9cb31ea7c483400623e4203c240b7c005","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-bad61c5.tgz","fileCount":117,"unpackedSize":187365,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYWXJusRNjjfVYhksxrGyTuc5dOK103LNSCF4Mdg7UWwIgH0qYhToOt+S68m3Gr6qsbIJpbNQ7lqph+pQyYrn3/dY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzTnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrG7g//eXJgSnR1vAIS/GPQbKecgSKAn33A/VwyVrKpZnNtoDFBPik4\r\nHBBezcBgT8nNj8JIl1ZSoJDK/PHQ7RLb+rtWKbBPjpuewPPeC591yeeY4E3R\r\nTycmvlM/DAEJRf6/gy00kWS3Q4cTiVEE1lgXRQNym1zvzvHSElz1iJsQ9sI2\r\n2nMj5OSScTDyfOqKTzYSfXxZ6hllq26lXlsTjokwZiY/3TixBqKJ+CyT/HFc\r\nSxEpG4grvmCkmm+4Gah/jt3rHffuVEyWUWyP4jcr0h0IkuaQIE8GOcBZiITH\r\npyUH0yAkz0h48Q0Xr9WlYNZMF6sRzyxo5K6CSFeWrWVgDSSm4dSXOpqK4l2h\r\nIMiOseBH/a9/7VO31u42xnE9F+7++rFv4FHa5ZuerS/iV2IRc5iPZeWAv9Vl\r\nrKYipRlqcm6Mf0m2RQt+NMu4WPpBpAq8bNX4krbKVkXBWC7YbGTQHuIv6gUC\r\nj1mixn5hu2P1zWXAY8rUQ0FKNtw+MKocYG/oXBopmnleOjhR1qhGoNrY2hAm\r\nB1y8IhqyaYjkKCiNF3k/QM11OoFTHIWbESlCpVmrpVV55psIKWXAuYpnk2DC\r\nD6t7zUtqHU5UBKvRxK9bqOXpDNmnwDIEuR3ibomWkhdaLS2Y+snD+6/bdhs1\r\n1HM2TCw9Owy0iyhSHd5rh5talntlM78mAIk=\r\n=rjXN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-bad61c5_1671116007396_0.35782721037655985"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-f92529c":{"name":"drizzle-orm-sqlite","version":"0.14.1-f92529c","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-f92529c","_integrity":"sha512-Pw4uO9NypRWAR2OPBGxMb2Kn2sbw51US/TbAo7cBHmOaLUi0AbqGYgZ2HRvXu0a8fkmYb5iVzQqiswp2/KBqkA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Pw4uO9NypRWAR2OPBGxMb2Kn2sbw51US/TbAo7cBHmOaLUi0AbqGYgZ2HRvXu0a8fkmYb5iVzQqiswp2/KBqkA==","shasum":"69dfe453326d97954a8ffaf54f4fc831a6ea2c7f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-f92529c.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHYbqpg8DUL+BBxkFR5Ik7ssbM9tXPdsrq5CZa784chLAiEA5iM4XiUSSHIY5nBINz1Zzcadx6IByTFy0blyNwUyldw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzWZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrc4Q/9EzG7hLrsBPDHmbSWg5GyFC8RG2S6R3kw/SLRovfw6L8IsHqL\r\n8n7M5JxZHt+0AKZvHnoG4F9tjt58UmEMcGyHk6V9kQQzdbaQBL1/13mXpqh6\r\nAzk48AKYMg+lbUc/rAGpzWjpqqpzFsj/XNzG3WrBcfU9VNsRqJcIuFp5JkPG\r\nM907QJFfS1FnUGh7k61lfyROAktyFBxpY0EgcEM6EnxAlQCRTbqiweJWNCfw\r\n1KHhFE5Ox523o8BJiqqzDjhNTBonXDQH8Q0QyfPiN7ojbz98cB8bFOfqV5Iz\r\nWjzSk4dZekJAZqLQO6b+FZSM9YCz8veKnw1HhAUtjaDJtCK7Zd93UN6h9/0U\r\nwT6bKP46X+ZNq6xOXSw8lujsQ2yE+m8I9sWFDHC1ehil7HQmjmljFBd7jmRr\r\n/iEYK3X2FufMC5tcJaRsIflzAQ6+DQY8cqc0mvqCoMDrqlcjqbQhNyZ795Hl\r\nc4g8nwNC7YR5d8Zk2niCU6xJUVVTPcUmtKDTJRShGjgY7hZrgscz4hFVOBdZ\r\ncYd+IaWegDlhz5kUA6mscF+c1puS/2BRZh5/0wzvLGE76v6kiVNIo5vNX4Jx\r\niH0xWWXC7NgOadCDWkpZvzidNZzBwWdHkHdNYomoXYmTouAx/2LBzBc2twbd\r\n6Nw+vsMsGcHPCh0gmZKpKkXryL7Sda0PjEA=\r\n=bzVV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-f92529c_1671116185538_0.858403155347585"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-7d1d823":{"name":"drizzle-orm-sqlite","version":"0.14.1-7d1d823","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-7d1d823","_integrity":"sha512-+11KgbdxSEbI9+pZLyWCd/yd1mSbrtfp8r7ixWNH1tDkojrpwzG4c+uZzodai+FaybHNkAvR1vpezEE0TULE5Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+11KgbdxSEbI9+pZLyWCd/yd1mSbrtfp8r7ixWNH1tDkojrpwzG4c+uZzodai+FaybHNkAvR1vpezEE0TULE5Q==","shasum":"e85737c5d6514ba387429e77a81657a2d67237ea","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-7d1d823.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJxTvrPpaQFk2FDVWGc9w/2KQHX5aA3+sXJ3ZH/clXnQIgPlw5GBH7Z06xRfnpclI0HfSkftpp0FoWxPy4OqK5wC0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmzbuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbVw//WUtWmywevULueuMY3+NEZKcE94psTlZFi+MY5OeN6fyMADHU\r\n5SpfqlJg9YeDU+WDXFYVEsQWxiGEp0v41W363GX7EekoqbXDUK+bX80LmBUf\r\nHHr/vrNerI8w4RK3Lr1dH9rbQks0aIWhi9rKWIlnqyo2ieF0h8tPRjI6EB0E\r\ndhvE020kYpwu0ez2aEGY7h8Gh1Mqs8xLmO+IT9SIU+2bILds6R5WJQ61MXWK\r\nFAgG8GCpZEAvbb1+xs88HB7g/JGy0AWZhbB9HUPXmeD0uTIX0/UZq9ONvVLF\r\npFfMVG0DrNqoxkNA6I/2+mqcZ1OVI5ptu4ADfA4RTz/ZMHE41IcWraj5Vjdd\r\nOWptS1bE89LXLDuJhXVpvkrBpcXhZy6BdGJlDVAvOHMNB50p3/tOZGXQY90L\r\nkaiYoygvW3IJkMthOpO905EhUQFl8C1yugc3cutTChBz4ozo0AD9RuPWX5zp\r\nA3sbIcJLgNGZojJ6xUVG1Q0gwrR7X1O9gImvpzL0v7K7I3aDsjgDG0Z5hERw\r\nMMBPBCnCfwOXGzJKVwI/RuYikm4FpprPAWbaGsY89p0gxV+P7Vt503LVUscs\r\ngXTapHDZUfslx/nfDWCyGQbvfQGllRJVJaaB8YbdbezI3WE+X05N/jOKJ2i8\r\ntT0K71he8Z8VkkxouFi8BG9is4nqmbdpJ1o=\r\n=X2W6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-7d1d823_1671116526397_0.5863632081027113"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-1f44b00":{"name":"drizzle-orm-sqlite","version":"0.14.1-1f44b00","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-1f44b00","_integrity":"sha512-IlSgKc2mTTYjW6wjd2/tyTsPT6EfXTStqiYvhxFtIavorHEO5Ry66FkZovuIwcC9MfmY9ydL1kAzrowOHS+a0w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-IlSgKc2mTTYjW6wjd2/tyTsPT6EfXTStqiYvhxFtIavorHEO5Ry66FkZovuIwcC9MfmY9ydL1kAzrowOHS+a0w==","shasum":"71ed6117f75d9187ed73fd0d73bcdbe279553577","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-1f44b00.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp31zWtJLVk4FQne9rwPTfZKSzlJy+oGy9DfaTiiy4ugIgH+ocxa3yKOTcPSB4ZRTz5HvzUGtmLVTb2jsB5HJIom0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6ASACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAvA//e3GX4FevzpAMXMQjVITbTyS0GtMtADS7LISl0VIM+Ap99kbw\r\nMcBJ3RSKmSF6zNhNDJwbpgNhlXj6/6XucaeDvlnIN1JhDnM86Sy0CkAvns1m\r\nOASkH4iQcAj4BOJ/STxt46dKaw/0LE4aYm00ugKpeHUZxsN/FixguMMWaYSS\r\n1ooVz9smyNBbKECDxPyYUcu7Z4lBk5hoDqomsRNiGLl0oamDLxt+yokVqBJc\r\nfEWIr0qq4yz/Zur2bM0Q58Ux87HJnmos3efvooqROiDdm1wY8dFMGXZVtAQh\r\ngPcoMnm8rkL5s3VCxA1dOlhsmXiTj2ppq/KLstxheyZk/TuZYaE0tnb5aLwb\r\nu/paRtr2CIi6KDj86IJOOAQNS2feX4tbpLCGrJywdAgt6vxdtVtHR1NGmLWg\r\n7e8jta9adMXdpn9Jq/qtFbekX5mpUJBH8DoMj/l8nRnhpS/w629Kw3NfT4Yx\r\nG4fnVrqR7qj8FN8nHvUY8DsyNu51X0FUbVrLOC8HBV7YYbWZevXVFINS7yny\r\nkBDOd9zZBiG+CYaAj9iq6071YokqIm83uHyKCH1avkNMAxvVBiVuAIQH2+Ci\r\nB0KUs2EJgU45g5+R5aHcywcw2hXb2L9GnPzWxM34u8VgjPgr5pIART24v6+d\r\nknXHLcc0Kj61eJew1PIWWPcgIlg2SKrpblk=\r\n=4LmW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-1f44b00_1671143442125_0.7251663695711426"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-1c58471":{"name":"drizzle-orm-sqlite","version":"0.14.1-1c58471","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-1c58471","_integrity":"sha512-4/3B9Qf+nFRWyetsbDC4M4+bd6ggswNypkUn5jMMtUH/m2yE5qquTi0H9ohuv//chTg8TRLQSw0Z87CtWsdzDw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4/3B9Qf+nFRWyetsbDC4M4+bd6ggswNypkUn5jMMtUH/m2yE5qquTi0H9ohuv//chTg8TRLQSw0Z87CtWsdzDw==","shasum":"4d87efd9db33d9c66c98b1c9b42f0c67119c0f84","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-1c58471.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+vJlkWqEActGxzZnKhJSNdb7rVuY0GmzCJHm/OQaK7AIgWETz+q3N3MXIqGR/Fxqii8pL8TzB4xhCKAPjSqKlqkc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6B2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPcg/+KIZfuVYUgnvtEAEMN3YHLUIycQwcfOgi/OQNZeeATvs4JEFq\r\nQC01PSaZ3Bcpep285a1P48TfDbiA3gHAStex8G08h2R0Ys3pVvqf9STchlx+\r\n3AV1TxMxadBKJJSMyyLoKxO+fCZWNw1IV3W27nLg6LRqdhaet5ieSiiBuA5y\r\nLeWvPEiFim6FIHCo4vjo21zSiwJo2TuIlRevfdPvi4ojk55kBUcX57cr+SmD\r\n+d6HlR/Vuu3qwwvEIZY448t0+WaYYpTmCMyJsHt/nyQYXWkNtxCc88rXXzBH\r\ns2bCgBZPQiP6+hlVAo8kIgJXbcuuYLqYIAm3YfgKBQMdbs7ueOASoNHOWZ2q\r\nqGNCAAEE7QRm0cf6YoUjQIeBUfjiBGM1Pz420u6jGrV1VJs18XXt5i2iAHZ4\r\nKsZiDOb6p9srTzjFRi8i76n2v5rmGw+Qx93CwJ80YwfcMRfUaDv0RfqdbdGO\r\nbKUS36zmj0bh18sdU1gOvFaUxIoLvCZ0ELJE4SrKY1YqW52WqppzZN2dB7sH\r\nqrPzq96b/9JqcJgVMKRc5lmWNTB9WUAYFvKm7LIhpk+31bVPE7X3QPjXnCOo\r\nPJfvp2bjeuMLTN6cY5p5/UHuV7uWaBOic4vJ2QkG3q98NL/4IEI2WlSQ8Fu0\r\nkYWWDJjbBHtwpNmMZGZOPgiuNuaWqz/ldx8=\r\n=mI3p\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-1c58471_1671143542178_0.6395461442797807"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-1d98f11":{"name":"drizzle-orm-sqlite","version":"0.14.1-1d98f11","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-1d98f11","_integrity":"sha512-wmbthGu1Kyu6OTonelq6yag1wPU/5RMRj5nVCii6YV0tqDECBOw/+ZjWWedCmV1JAB9VU2AWxG+Tnauf1OGlcQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wmbthGu1Kyu6OTonelq6yag1wPU/5RMRj5nVCii6YV0tqDECBOw/+ZjWWedCmV1JAB9VU2AWxG+Tnauf1OGlcQ==","shasum":"5de9338a4d923455e23a4e3af67b1b792dd02c7d","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-1d98f11.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwdEqLdChwqqKrgPZx8vxaXk6SlPgVZiyE2+/rT0qpggIgQSZgDMiTsTANf8yK5vM7sajGiNEGbkf3zXgtTXFn/Ww="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjm6DdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDPg//Z4nvkTsoDNH8E6QTZZwMKZ1Z14q83Zk/HvAMUT1DiZyTo67n\r\n95Pl8d7KbMupNDta2O3NtZB3yJT1j7Fv1XakNK77Ox8lei5n2LgeMF36BIwT\r\n08sxXaO9l89+oju14prxaAacVqxUsVckh/d66/Wh+yqxs6pgEaWaPj3cE3cG\r\nKCsEx5s9CdgJb99spLTRPVTcaNyde9tsjCZmJTFZv3qJJ1oypZjbhhZ/UN7u\r\nabQFN+oPf/lT83uUIN2098QMX7lfWZScB1bFGeRyphF53LUBhYViZh3xG1pv\r\ngZttuTTvrLdbISzGFretdxnnFsSx2IA7pTtR0bPwPVSB2rgl/2IbTmxvIwr4\r\nsZ/kwy6XFy4rWufSx8CbUt9NclJ5h4jZ+z1NxHGIgC3vmXU+9M8rJCTJdXc/\r\nFigaJGxWjrp3SeUWUIKoJmXG8MIZpV6l1bgzkRjEJ27H+MLpfo8ph7L+8lgX\r\nFTNcuNqF6md2rXfkqasDmkMYWCpOdQu2eNOEJQAwrk5MIVQYV+AF/g3IEW0B\r\nJuDasYBn655YGsgGeIeTcNCUxcj4zMVBnRcjH6rYXDQ9WRYtf1U1qKzX3bjA\r\nPEhkCbnNM7lVRmKjK+p6QscF+VeE55+V5SrqHIO9KI0Muei/t96mlVvIxgEl\r\nGX6QF5KKx3Q4AJDnRF0hQyMYFnwjcvcHL6E=\r\n=hFBM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-1d98f11_1671143644824_0.9840817496776373"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-f617bb6":{"name":"drizzle-orm-sqlite","version":"0.14.1-f617bb6","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-f617bb6","_integrity":"sha512-Md5X7Sa/JTMfB3fvN6BBzEHaa9quhshHvIcaJ5cwrOSpb2E+7w40GQva4pZMpaEroyd77iIkFZIOcoa7qkdR3w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Md5X7Sa/JTMfB3fvN6BBzEHaa9quhshHvIcaJ5cwrOSpb2E+7w40GQva4pZMpaEroyd77iIkFZIOcoa7qkdR3w==","shasum":"c8bf43cc4630e077eed1f3bda243897a55960e0d","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-f617bb6.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCI6HDG1ltpHNSvbwIXmFmElQfm22wypxVZ4td0cm2CywIhAKwNjoCp0i76AO7e5SqKGKuEvgO0lXVoI+c167+MKjzC"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnExqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5Tg//bsjHmIz/LKXWBE0d2QlHTaeol3tK5kPICAv5gTN9he6ttJyD\r\nYTVh+zBCxRYRrveiCxIncmmX/BKznZgR6+kT5xXlYPiEkBbjv0KoiQZ/R7jS\r\noUy8wj9GzeZ6Sf8rxIuV1BmnJCvs3ygTuqs+J+fxpHNDD1TpOdAIc0Og6+tl\r\n9yb25vo90UaSr2KywHAUWKhqt1tFqonCGpN38WWG1Y6qkNVKEjSnH6iXOcnk\r\nulPZVPVSatQ4RpYDo6XIpgbsnPhVNYXNpWpnEyyfAwT51DOYtD/HyeqqkRM1\r\nKw3WyWMhVDtxMHCsT+f4ETGnumMDS+n0fI5SY1Z3aiRwRSAUIs/n5Vr9249m\r\nrLrjFq8ba4BnX6dsNzmx9Y+zKY1zNDcJX1PbQ8yWd2bnrbP04AsqQpBxoEzR\r\n4bAnlbVLl18jLZUjwhdP0C3v/t56ncIMUUG3KfAoJUG4LCC5X9BTuixjYgA6\r\nuCsmu/kY3xNRY8J1hEiOBElW5gy5AyY+2qn+gYfZUvhk/se0yRLetyLWHqjH\r\n8cC5F5auWGImm2bm0QCyHcv462NJguYYk36QqMYtJjHVhzC7C9uphfcAw6Iv\r\naFK+UfXU1pmBveHejYGjJsbtXdmN6/Lk/gqmQxlggT0jhFUZ97v+0R4vcgbI\r\nlDxQzOZr/yUWmcbzoAXCzYBvnDhwlZ+QjrE=\r\n=mn8W\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-f617bb6_1671187561957_0.9401642477399785"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.1-c5dca58":{"name":"drizzle-orm-sqlite","version":"0.14.1-c5dca58","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.1-c5dca58","_integrity":"sha512-KZed+9EdaRJmRntkeLZym682R4cj7D6ibwrRS5qiYwRI8VQiUGiFOTnPJeY8K4OfmC+p9UfEBqykcDyI7WNuIQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-KZed+9EdaRJmRntkeLZym682R4cj7D6ibwrRS5qiYwRI8VQiUGiFOTnPJeY8K4OfmC+p9UfEBqykcDyI7WNuIQ==","shasum":"721d6715dc1865f22ac866876aa7a41fdd1f06e3","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.1-c5dca58.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/v0HnZXxdPdjdBykRkvrOG2NfKqsr/qTdoSCkqKqUiwIhALUfBOGICb5BenVxR4wTNScJRr7lM0hlJr+WC9ITB9g8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnE/PACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrkHBAAoEhii4rNVDus8brrrPrSL2RZimjc5vMkpMg+gLesNd0yvs9Z\r\nY98aWhhVf7Gs7E+Y0UFGs8qpTrIVoORwuzVug9Z/72lO19Gkkq2duRmU2CMZ\r\noEaGGIaXOdkg2rpP/Z0Y8zsl2yFd5/i0h/Tr3y5GRCv66Ujm/+Zg1SEmIK7j\r\nTeBTlflQtaF9aD3z972Brx5z6c4ykRicWf1Y293z3acl0j3Srbx4zcQo9P8F\r\nAGxnrLmbP7ydQ/fdKxh8BxoI/ZVL1bUJHwf8Bx7/soUmPb5SptH76H7mC9TY\r\nV8edXCzqS++lI+VmXF9MgXNxOgX4j/Gbl5HUhqs5Si6Pcu52uW4N4RqzqMRM\r\nM6HbTmxtIX3A4l7ZWPJpHjparowIEG04fejQekHp2vLnhZbS9UerD+yR4Hyz\r\nmtLgb/JXhHqXydHugEYBV8hHlSImhz5zQM5J+ZiUgK42/GNfEiwr2jWIXXaX\r\nW5EGwzJjc7zW4lbY/ds6yYpUNSETDFt+kmot4meWMJSPdBL0Rn6hhAy7MmJ7\r\nuKh7+oaA/wY9lpZma6EBaRH35ReckSmwziQe8SUunezfyiN/7lY9iQ43bgqt\r\nDVWeqwP29oEiwvKBoGTOWyESa34JgGzW3Z60NH7KuOyFRPjJXcSxJLEdDtoa\r\neF+4i7Fa/t2zUdaL6xC6toqXiUKvGo35+8s=\r\n=P5sb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.1-c5dca58_1671188431177_0.1904934599635797"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-3793d78":{"name":"drizzle-orm-sqlite","version":"0.14.2-3793d78","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-3793d78","_integrity":"sha512-KHwK0d+cnZBoUmIAsQta/T03CpoAmYujv2pyeqY4HjvDzb/EKPgP7KLdLqtOdJz+3WjzNfKTQpNHcAtBD8l7/Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-KHwK0d+cnZBoUmIAsQta/T03CpoAmYujv2pyeqY4HjvDzb/EKPgP7KLdLqtOdJz+3WjzNfKTQpNHcAtBD8l7/Q==","shasum":"f59712d8ced28464cfc5139b4f461c0c5fbf1e47","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-3793d78.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBEO6sreQc62gkS/EkTgb4sETZgoPE83p8lZVhBgarDSAiEAxGdIYD6vZyrel4EAlkWctl7gAWA4Sv8oCGaiP0FVghY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFOWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpZMQ//ZGOpD2MWI2owDcKznleXD+/qCRotnf0FvGUiy7/z1K2i4QaT\r\nqG0z/4xYn1apKzhZg3gEXh/2Ra16/1Ps6OoD0SSPe0lOPOHp6K1yeU6kkf7P\r\nspc9xbma22qdgKMkNFQ1K+8ZBL44TPLaBPwNkK/R+O6VmFuLboJ6JDuRuvUp\r\nNfSLCXDhXnJ9XvDo9KL4Ys3JP0Rz29w7m5JKVzPN8SwXxtdq4/WwlqAOlrzi\r\nMpZ1M/Fs7oAuHtLgHQD7wUqyR2cA+Ay7d41wqjUpAFIVhVYUpsXz8gq1mQU+\r\niWhPncSI+BfEzrvRKzIES1+g5DVJDmBXOsQhndj1jdfy9WzvvzkxSx2z0KaJ\r\nxGsTk+InrOqYnQvbH7CXrr3o19IjF2DXxJjbzVP7B+8jr4puXl/7Jfmd0nlX\r\ncVuePrqXuUG18d8UpFqFswW/o1LI/NHr/E2SMZr2AudzuXIwfmtEuxx63tdE\r\nJ7ph2V9IvPlvz9v2oam8v5FuQAciqUEJTBcIqqtuWpgrlzuP8XqBDFErcg7J\r\n+u3+tdjSw4USaFjGr5Npun0PqTFHImSo+Cfmu4b/bKz2ZRD/i7a1wFsEuNaH\r\n219ir1swNra5ClTDvltaHrOF/yPKgimdFLBStHcIpy5CbAkk8RM8GipuhSKx\r\nSUPzm0wapanwBEqxhiolul8cyPMUEJVzo7w=\r\n=yxOX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-3793d78_1671189398501_0.9752362609487952"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2":{"name":"drizzle-orm-sqlite","version":"0.14.2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.14.2","_integrity":"sha512-q5lB0A2rHLNEkBK5ROj/y9hB1e7cCB7aPQ8borFdl4oBwDkWtEpy90FCa/nWv/dUx5SQ0gaoT1hEL4G30FWQnA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-q5lB0A2rHLNEkBK5ROj/y9hB1e7cCB7aPQ8borFdl4oBwDkWtEpy90FCa/nWv/dUx5SQ0gaoT1hEL4G30FWQnA==","shasum":"596453ef16a7aaefb62a64c1ca28fbc93360be6c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2.tgz","fileCount":117,"unpackedSize":187715,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID0HTrULHQp1MPfeZso1ZwghiS6E7BUl6JKeBlFczj+EAiB0UiOdmxC3TE8iF3SqUIm0COOGrST54ABrNBZw+SJoPA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFQmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4nQ/+P9AgH+bfyuUVxK+lMBn2eIsi1/qObdSGSvjq7VQvYTRI7k7l\r\nFZMqxGfYc/q7GwoIK9VQmJLTCxfdspgTUlH16hAoQmY9ULEuoXQdE+BrU2uf\r\nl2w3W159NCVHfH11w7v2a8TLT1R9yAFLFEDBVDOkI0Hf9V6tIOfAsBDRhDtX\r\nB9zVm4u6ViZXtnOCq2xlt/4+vmN0TfQDFEcuMLXqkPNqpxJD2KJ6Ik+/XEKc\r\nD32ZCQnPFqJYk+k6mbGCC7f+EF+P8mY+kIqkM02x3y1JfMVg0qsvDBoqgPFz\r\nO8dwjmPnWsOUQBd+pdpAFbsEtz7u/NXAUBz0ONid6UoqDiBPtaMB3yHm7m1i\r\nLmOMRSBF4ptFeb//Cc62ARaOXi1AdCpE9+yKb2Cu49univPOgzXqSkFyGSZE\r\nBlGDTh/TMuikM54ldI1WvDx6tQm4MwHi/e83/IDUiiV+e73zRWseirDNdVab\r\nDJj66ckNLYRFwz16elv7+ZoX6xewZH1CZTYRtoH0MSadlBQtf4RkoUVO1fMF\r\nwRc7FBINgDpKiFV1Kq1jOHag9BRxbSC9zT9Vq/YE0MU3ytx1wsp3vLcXye1L\r\nBXbMVKgSKmVLQdMGZgvZXyIksnMnDmkM3MUOw6N9vyJXw5pz2ofX6SCVAXJN\r\nLNTudDhdQ2stCnkgoftwvEOgY6bozaNV85w=\r\n=eBTD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2_1671189542210_0.7383378353905641"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-3967f06":{"name":"drizzle-orm-sqlite","version":"0.14.2-3967f06","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-3967f06","_integrity":"sha512-SHZC3Uc928eM2WR6cQAegHFrq71zoEFDiRwYZAjmIK5EB5ClCU9c9U/tBI+ACPV49lEboB6ob0dd+HqLgYIWCg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SHZC3Uc928eM2WR6cQAegHFrq71zoEFDiRwYZAjmIK5EB5ClCU9c9U/tBI+ACPV49lEboB6ob0dd+HqLgYIWCg==","shasum":"604f3410e27be0c7df36e0ddf7a6939e91af8b13","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-3967f06.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbKZJpdauxM1j5ckCH0cmBJtXAqeZqCgTD78wKnjUvwgIgG2F86hjpWhjX2rc29vHAalrnISeHgbuPlPNCBYApuc8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnFTZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoxNg/8CPWb5MMh/9sp2WdGJiWGaV3DGRjhEovpZY1fpYIBo/GURVGZ\r\n0EtrXkO7JwdA2kJKJnbbqtXDjBw0x38Xa/BBHtQimXnRqXck8zK4Jehztpgw\r\n82WHvD/Y6qcBe1ZYLJ1i7nI9JtKyIxpWN0d6Db2gI2m34MPBw9CIoFoggFTx\r\nLNa4P73WCsLKhVEHc31erhd8KF+GglkU8BLAQ7AB8fEHnyTapU5mYfDAfifY\r\nCdYXre2am36uRaNgW7RwWmmx6T5eq4bUzQd8sEM0mMk/Ly6yFCINTIFU21jG\r\n+KndHQFjlDw+Cu/1rZ0Cy/9wAQHqz8chMZvN1uPwVLJ9RC6+s8WrQIWRYmIz\r\n4nBQrDx77LHWPwXLK8JrtGpiRCydpI62jf/HU0sxL9ib2N+YxSBgpoDfRBzj\r\nQOu6xDl4Tz4EmzNlUMpFqu9hir7eZopddmxJ4Xt2vwwC1ifU/CsVUSmwwFzO\r\nW5sL8mJbRIxT14fXdgHLx9kOkUcbTp/OXs4j3o1tcncUOks00kh9lIqNs1Fc\r\nkTXfRBHgbBy9tAWH7QnmJ3yvtWCtcEfA3xsiJktPdcqPVnU5nZw2WkFTmlXG\r\nzjW1pY4DSPfxTsZxQJLiXTaw144BQJ+Q2wGANCPzI7tCUnjioM91cZsRGydz\r\nczdGdbOBZW8Q70/TbMKsk163wPYTRVMsKF4=\r\n=rktK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-3967f06_1671189720903_0.7078419395045465"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-e902ba8":{"name":"drizzle-orm-sqlite","version":"0.14.2-e902ba8","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\nDefault SQLite connector is using `better-sqlite3` database driver\n```typescript\nimport { SQLiteConnector, sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { SQLiteConnector, SQLiteDatabase } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { SQLiteBunConnector, SQLiteBunDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: SQLiteBunDatabase = new SQLiteBunConnector(sqlite).connect();\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { SQLiteD1Connector, SQLiteD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: SQLiteD1Database = new SQLiteD1Connector(env.DB).connect();\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { SQLiteConnector, InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\n\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db: SQLiteDatabase = connector.connect();\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = new SQLiteConnector(sqlite).connect();\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = new SQLiteConnector(...).connect();\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = new SQLiteConnector(...).connect();\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = new SQLiteConnector(...).connect();\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { SQLiteConnector } from \"drizzle-orm-sqlite\";\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst connector = new SQLiteConnector(sqlite);\nconst db = connector.connect();\n\n// this will automatically run needed migrations on the database\nconnector.migrate({ migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-e902ba8","_integrity":"sha512-UZgUmpccFeXiVe4gf2SCc3NvoFTAsR2MUO3eyTYeeGqiRyex8VyaU92ys8pSS+DjoSUeMkgX+AaGoiNzB1JWYw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-UZgUmpccFeXiVe4gf2SCc3NvoFTAsR2MUO3eyTYeeGqiRyex8VyaU92ys8pSS+DjoSUeMkgX+AaGoiNzB1JWYw==","shasum":"c29280c70e7e2b38bf046abff625979f91b242ae","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-e902ba8.tgz","fileCount":117,"unpackedSize":187723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgoIMiHqnxuVVZUeFN0sb5/oq5OJ0xjkkEZ1qzOD/c1wIgQ8sRLh+L9g96f5PW2VU+QyfYj0VU8u1pOtdg2afcucs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnHIeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqBtQ//Ux/VF5i5hFQNDgef728IV2O7dk4+mFWAl5+QDjv7mCOGrfnY\r\nkS5FwBxIUDhQ5ZKnugkCzrbiWhNTqnlUMV2vn5IYp4nBtNIZ4gcgURwbrOwm\r\nWdNQe6Q3yX1EbR43med/+UqxiziRrdiSKvNG17+q5wjh+C096g0fErMpUQXz\r\nyC/yZzcMNNatp43n+TztzoutkDjejj3jkUq71GgCQGfEcwigFWs2Ytqs5ZKN\r\niza6GSEO9+NxPIJJSFnrDgj/qBJ9Z8pmzUWXFU41xMXxrRkSdbF2xXNsULd0\r\nqswRyu3zdtjz1+yJBwHYqSc3FIKmr0fBQLZCGK0RQQqv86v7yQv74A7g72LK\r\nOcdPXS5jrJN5eRWui874M7dnXRcjCUWf9Pr8RHVt829HIpLS0UOkgtLEy0gh\r\nMMJKdFMIWz9iB2uzd3RJAOHDW4Yg4cfglQgVUTTnfW/qBOeE/6jcwzpPN/tO\r\nHqI5E1DhYPVkH0+psPfmPkRCrzybT6ABHiIAaLHSvTAa55yjcAnJ7uSA2sZN\r\ndk1eFcnKj9DHSWf+vVOnGRsLDwDUkbspHHDDBZqP8BS0AvCBsdjcepII6uaH\r\njPU5TEXrsibMeUaiwt3xQDMjesE2COiRgSMZfKkWQNfYeUCYQsjEzTtNIzDI\r\ngZJCUyKW8M3FbdliTEb20OGsIgi9y3SraBg=\r\n=ndok\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-e902ba8_1671197213993_0.38213103038287466"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-9f4af29":{"name":"drizzle-orm-sqlite","version":"0.13.0-9f4af29","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-9f4af29","_integrity":"sha512-NG9dN9ZufEg7pHe+gH8Mik6eZCeebz+/kz2lJp5/tBKe3ZZBKKNac71o0NZSiNqXmy2jk2cKRJWxbyt51AXCOg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-NG9dN9ZufEg7pHe+gH8Mik6eZCeebz+/kz2lJp5/tBKe3ZZBKKNac71o0NZSiNqXmy2jk2cKRJWxbyt51AXCOg==","shasum":"83e0fa447dd0671461de59b3361b4eaa9e7bd0d7","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-9f4af29.tgz","fileCount":117,"unpackedSize":192852,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfH/vd6BY1kwHkNxH9LvMArbThquTn1s0rvz0BNqxRuAIhAOIdlLiFmMfLHU3viR9dB9XWbYwK6SBxjh0earhTKA1W"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoJ3EACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/Rw//R8Qs87Sya4KmmqeBymG9vldybQE5xvSlD/VK0Anlet+s0BCU\r\n6viuVQmaDeCUsbDW8aZ4tLr1wixLjrN4j+sW7Wh8pYWxakHrdgw0epeqEMyi\r\nYAzgpWIEEal5qXGR6Vzsi2KYztCe3pnPDCGGtCiPlMkQALZ68wfM49/tQX5X\r\nZXOOWUdq49r7AaKJpJKAChhcB8ygi3/UcfcJSqj0lv1lxwuwP0IdbJ7Lz1SP\r\nSyZm6QCXlcB0+IiL6UP5w0WX8RKnUAOOJIS6pT2xfylJfcvbqJjSVbO7naBU\r\nsvfgmP01ZJnGWxN8rKPUeZzjUYXQ440Dq1w/LCrC3BqagsPZgVHQnoh3HQxX\r\n0P97cmicZHag+VBu7MrvhfIBcO1qiJjNK8EnmKcukPVurn7Lv4xIspIKRqzU\r\nXWNTgfKKZ2ZAZ1m+7gSScnZrwM1v651X9j7f7YweMT/gJKmlQT2a3sdTxRq+\r\nbtxKfIU+ggrFNnm+VMtM7WQBEF+bq4vzkBHTEobK554dqLJ5kNgMOPNxAupR\r\njGnPxUC3V9+7DdMYhUiMt9ON7M0AmcuwukuNtk0yqz0A6bWrZMDT2/M/HoRV\r\nCO24VJ+DQ2JG4ger14q1LyCwhR2ZITXI2Aop8fMKpbcLEkPN8bahv655A6X4\r\ns9C1vE4oEOcC17uRFuHZdLiArT57Vj2lUB4=\r\n=78Ls\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-9f4af29_1671470531794_0.7309431360174832"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-5514014":{"name":"drizzle-orm-sqlite","version":"0.14.2-5514014","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-5514014","_integrity":"sha512-Lwsc96rDhj5tnE51PBaOcbJuf4SSOl6+378mOZfrsKhnQ1Iu4Iu7i903Huv4XJQaor5pcTtad+cOPTEo3k924Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Lwsc96rDhj5tnE51PBaOcbJuf4SSOl6+378mOZfrsKhnQ1Iu4Iu7i903Huv4XJQaor5pcTtad+cOPTEo3k924Q==","shasum":"db8911cf05cbff654d51684607c0683702a14c2c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-5514014.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNpBbW5lJsJKSRut/mejwFIOsq5/cR8NrKIK9CxQfvRwIhAMJR31JVI2RDVAfKWwchUVq/EiZeSM53dFHdy+gcSWMc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKM8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJdhAAhRcvfqD23popHwRF+uUyYFrUtJHNBO2YbiIVx9uBnc8ZORPm\r\nfQW66bYqVTH2wzC/7rJ8nxUTa2sMr328XwuBYlYQUAYQ68KED9nX1OTwmbMm\r\nJvIv/IPNnJL/MCHqIGuu6imFJVt0T045olZkXI3oeZJvGRW7NsY2X2Mi/jRQ\r\nY1p5MiP6PqP0I09fo4+7Td22t2sag43+1aBLDxa+0ejwgdv3+PpcHXY81Kxa\r\neL+AQutUMsFTfMVWBP2H6yVrMpKkW9+zR/FfloW5gZz2Vv6ojexZdMOa7Xqt\r\n2T9FpqaGnuHIZgT0uN+gJnpDs4GFWa3RRoQyWUjFwhUvBU6tkOpOcpp/YA1h\r\nNAO+anKBgRiTxa1ji2iGUmwXNl3F+RDmq2NY3mL7HHoGKzp0FtbqchEU752L\r\noBMm/9sBCDIVF7i6ncui/2qq3VFOIwqJNBcJcC1iNj+rP+ddfGVoN1vK9yP4\r\nZrcsEtT5bo7HFgv8heKX6W9MaMwlKGsrzDEz3dKqSRhyPy+E3VZ/RxLp/ML4\r\nXgSlP8pDrU6ku0MiLwYGkbQ0DY67mekPKLCU7SuFopQ3sp3LY6RBc8ImCzh3\r\nuYW/vDYItidO3UuSMjePd6NzaKixCT+zvKESpFuFaTQY0hImgNsxDGnQJ0JS\r\n2R9jMxGBshmpE45xGj+IiV7wpoULYERur8g=\r\n=OyN7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-5514014_1671471932243_0.4160678963178708"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-cc06fec":{"name":"drizzle-orm-sqlite","version":"0.14.2-cc06fec","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-cc06fec","_integrity":"sha512-9jLVOqRZhmF5BVGEWSvWoExLz7VXoE9kxCRPo+yE0wgfMi4KcK2VHvinMMvfl7Q48loAUDlRrxU7GNTC5rpElw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9jLVOqRZhmF5BVGEWSvWoExLz7VXoE9kxCRPo+yE0wgfMi4KcK2VHvinMMvfl7Q48loAUDlRrxU7GNTC5rpElw==","shasum":"667341057efc7597c296085560ce1bde4b3a581c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-cc06fec.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJwsMqzdjQzcKS92qQx/ozDDD9AUwEKTlqlGvf/TUvBgIgd5oLiWF2SGrCFHgUIXmVAs/4VLFtrf2fvX6I/q62J1A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKNXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUHg/7B8keqXa6rs0XKJ5s7xU02u+jO4wiQOChfKUE0Cxdg6TRGHvx\r\n1o6TdiBcuok9sJ8vXf1JGm5lS3mR6sCKH8a8IAO8cH0XChfP9yBaoA79cSun\r\nfkCwOry359q+quNz2+yJxLhAlrv1g8R9QpFlhRKtaLFrWRAw5N/Psjm0g4Id\r\nwQBsZMhKM5lskV3Q22ZwOACG6naraXkLkk3PicpCk5pSFuQIZ2xyGgvgC57B\r\nVkS0f3oGAwRrLHrA0v4Uw1YxQy6nMnD7dICodCeihz0AtvApTqNsc/2nmWG0\r\nWZ+xGjaJIOAvJrNkKBBZ5PBwHdct1aGChBkh78kRM3Y3JJyB2+bXkrnHFdWQ\r\nSNyomw3p9ikVQO11nYIJ16WFi92GGX79ORh/lr2spFCRQgJv3C8tvXGdJ8NC\r\n5UnIU+HEI79ytQvjXSfvXqok/oU0qZ07tW5t7xs7kwA+S6RwMWZR6bXWlEDo\r\ndC2WKsKeVTYaDom/ydd//sZsthA/v01/iQi5SXHg3TkTAYj9ikChyfgFZrTN\r\njEcyRGCYNdBloAnamDlQX/QKvmTAPIlUbnHtRXE8x1FUqQNsXxPWZlUREJ/x\r\nAB5a4Hb2d03tYgvZw9Uld0wCSfTaUyJU1ruSa2gNqA5FjS9d/8BTTmD6Pi54\r\nZqml/Z4Qv6X+iPAzDBXnLaNERCItai6VJbg=\r\n=JN6g\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-cc06fec_1671471959520_0.6877726394888548"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-c7344a5":{"name":"drizzle-orm-sqlite","version":"0.14.2-c7344a5","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-c7344a5","_integrity":"sha512-fmPuqEcVA60iar70IhZ1Nkv2hOTjqFRE7/Mx4Z9h9UmsvofuUTvoPcbLfewyjtcHGc3D7lkNC6Tlp/Acdv4sTw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-fmPuqEcVA60iar70IhZ1Nkv2hOTjqFRE7/Mx4Z9h9UmsvofuUTvoPcbLfewyjtcHGc3D7lkNC6Tlp/Acdv4sTw==","shasum":"a5cce18a786003ac3b75bf0b68c2de373f03a744","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-c7344a5.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFA7eWKkqcCJPZ+jxedeEfI1PxL6DjdbAelOPsGytZJQIhAJ8KRX0lUKOJbd3i890qnZx5GFAXWf1/PM7rK9I9ROTt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjoKOPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp0MQ//ZQyOt9pCwN9ZVXoUZIMnC84Wp3qe9312LdO+kmcBbmtjdGBQ\r\nOwoXIgG1ZEioGjKvXeap1nb+T4YVXElkaz2D5ZOULati+Rx0uxmjGIPgjbRe\r\nlM/+vwmoKEidCHs7y5MSe2pFFPp9Inp0DcRe8zoPPKCOgDLX/HTpOm/6DBq3\r\nOkxdif/phyD7oR78Y5beL1+17fecIMeQh7AUL+vomPZi77a7hnz0WhUZIWkL\r\nW4qOh5KaiijI/rNE+f0PDJj88O9FEGw/UddZCaDS62KNIWD4aQ4kmT0nrXbT\r\nQ60LZkWib77Gb6CZZmTZ6Ex5DOt2uf9Ask1oMPH5BbL5k8/ve65nN5TIybwq\r\nL4wEG3sUrRLxersl7h4/lCwj8OhmM5INTDoxuG0262LMVVvUvUjY4+mMla12\r\nebdbsOs1sE0ETj90bF00e8m2B1lP1H78ZD+yixkzCYv16ez3cCC3ImPcbQeh\r\nxCr0yQWmhukYhCplmCwGGdPyj5hvPuSHGVr6PWX1ulwnmiEjhiYhZPYt6HB1\r\nI/1lSYozZnEzioLy5s8cztvRh8JtUTTvWaRIHU1NrSZg0RjbPVAl3/c7GCDk\r\nu+XrEP6692bo28jMLwFqXqfolJVXq0hGjxSm/sRTYXUeQbXRirzenGicMrOn\r\nM/jbpoyHhRrHP/QnnhP5UOg4zrsC+Jyvwcs=\r\n=v4Io\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-c7344a5_1671472015574_0.6930716807037542"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-01c3d82":{"name":"drizzle-orm-sqlite","version":"0.14.2-01c3d82","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-01c3d82","_integrity":"sha512-/KYT6G5ok4Wjx1c9N6EClnJTEqTKL7L86CABGQ6z6KsgJyhYCk/DjkMYtcGmrr/7DdQWHgTE6CZcT7iv/5pAFQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/KYT6G5ok4Wjx1c9N6EClnJTEqTKL7L86CABGQ6z6KsgJyhYCk/DjkMYtcGmrr/7DdQWHgTE6CZcT7iv/5pAFQ==","shasum":"857406da48fb870e24afcfa95cdd501b97bcd86e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-01c3d82.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF0g1Gm1OykTxRYFoXSTdKmD0SIAWR4rIzQUnTFTXuNuAiAiBjowY+MVAlBWXpXwOilmLjwxKdOkPkVy9i2OKKuFhw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjofyYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrMqg/6Ax2ue2tEA7vbRQ+6boMysVHv/SJ9Kw3mQfdSZat67W0tmVzw\r\n7Lh154H/L+qBdC6H/UeE8TF+gAWWxvOLGYjTdJi4KggLP2mzHK+39rmHWFNU\r\nCj8/Y0atNNgupVCm7azfJnKq+Zgr88dXGxrwQB+9USZrLGy9+wQfjUDw9HD/\r\nDRtgTSF9ou5zu89JOZ1LbSpavyANm+jZE0sSBlr9HTcgsu8+LrWrvvFkgTEC\r\nmdB+TdO154fEeAZaBhQZTqASzeLQVVwQZ0p13j6WvQ/gFRbBEgtrSa6fdKJ+\r\nu3ybKy2iXcij6Utzj5OcENNJYbm4MnHxgg5psQvOJBvJ/Zf7Dh56/ElxxehA\r\nih3jr4eH7fr5632o/yUVMMEvuGr877fSvyDQKgH91Bg8k6x1VG7spu1CQvul\r\nu5FUrZEL5NjtE3m73FTLbUrtFFs08LhCl//DEyTJmGuvw1UoeDzvaHQHuXAI\r\nyWI8HOoKaOXIES6S9R9wjFyFYz2fpZSlgVZAnWmbw1ApoRjlp4jxDs3HkyE9\r\nZiPk20wFFHDDteLFJ886S1ppEapJmqK5uKVWm0qJYkyfFK/X7I9zDN4iz+ct\r\nNdf8Ahvv4gm+hYuBXzSkI68nNRq30B2I5Dlib4YhbCYBlI6Vjtcxd5IcEnWK\r\n5LzYDo/ykgtvDymGBXAEHgCqTOAjB1ey4zk=\r\n=BNz4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-01c3d82_1671560344004_0.475837782324638"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-4eada6d":{"name":"drizzle-orm-sqlite","version":"0.14.2-4eada6d","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-4eada6d","_integrity":"sha512-Qup8eVOBeli78A2LlLlFbKXpGk6JwexX0cWe4qQwYdPjbH/vwMOpsMlIcQDS+m1G2LtkWv5xNC0j+Fu3qKWDFg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Qup8eVOBeli78A2LlLlFbKXpGk6JwexX0cWe4qQwYdPjbH/vwMOpsMlIcQDS+m1G2LtkWv5xNC0j+Fu3qKWDFg==","shasum":"640f67389de3b197cd84e81851bd109d3cacb97a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-4eada6d.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSUK48vvMGVpy4J4rI4WSy9+ldVKT+/8M6Qed8Eb9RoAiAhBrcfgxAAmdk22WWpbkNoopW3Dg3iGKWPzH+FTp/dvw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0eMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrh8hAAioclN2hspANpvrxUC2U3+iGNv+OlTtHSQxElTy/sNbWPFB6L\r\nLZ9AEBpwUKZBKSmlacY39OHOyjDc0H6g+QES7LMV4mid1r+2jsehLKcczUgI\r\nJ07J4Ntfc3ofPoox/OtY9w7WiV7yB1RDx/Tm5V2RwtzFZUCsaJl9Idp6p+p9\r\n7TWGBb4x7uyZkdlQkrNiX/22G6wiRA6KxhHflo9sbQThk9wcI393HHVYWfh8\r\nlOHwxXjBQp5BwIfvBQmH1QlGDQc+FfDjqJuesXiKnblkiWZ/DLihYZgg6tJk\r\nIiVU9bg5d04ZoBAhSpGpg+3iXAGAhsVHnYO67ncKz9NbnfVXJ06ZZEObjrGP\r\nZOZVrCKZyOGELoE5gfyKUOIyJ33QRKW0AaNXlCycCcXb70JtixXUETWqYTOz\r\nvBoq7VqVeaJn+CVJdUOJd0xnCzi2p7+U+38EhpnGvhW+gqewT8D+ly9DtGGE\r\neQJ+ETjpgS1OZlpK5AI1FQtLpyMCdyTgmhAYK1uWyHpIC5vja4DWuFs6x2Mm\r\nVq58U/o8vJfnvJQgiesItSSNrVC1uF+YYP6D+PQgMsqg08kwkMFGOxusqkJ8\r\n+/LaUYoZ3lpOmS5ugdoJKYCfxPBhmwqvdHVAK6mqRVE2VLfvY9mgJvNCQcZL\r\nu23lSIaPpSSwR//K+chZIfPYTaIzkOerhPc=\r\n=mjyU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-4eada6d_1671645068453_0.9874218356441746"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-1e42665":{"name":"drizzle-orm-sqlite","version":"0.14.2-1e42665","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-1e42665","_integrity":"sha512-Rve79wyUCJwLFaCG77ge/yeSBPDj3X1whJq74+ahpMSQpjk76a5bgVvZezI8AEVdGs1TDM7oaG/+SJv7KZ23yw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Rve79wyUCJwLFaCG77ge/yeSBPDj3X1whJq74+ahpMSQpjk76a5bgVvZezI8AEVdGs1TDM7oaG/+SJv7KZ23yw==","shasum":"bd46760da1588fce7135ab7513b8fe28434fbae6","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-1e42665.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/wHfWa0OKAsx7gIm+IRCAT8T8NEowvp43JvH/2nOjQgIhAJgYmUMw12HSLiPoR14Z1cDjeZvgiCYo4NkRnM8pgcP9"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0mxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6YA/8CY6/2U4G+pu+s1N/b3t9PFvG2iQyi0wVEOKJAV8enEfh6hdI\r\njweWlGQeMzMOR5vzVZFcF3G+3YTCz5CD+VmMvDRXII3LQZIey0goJ/S5GMAP\r\npGGaqxvPjWb/yhv3ykybFLxSUh/+ojfZ8Yio05oeDg3jwIYuPRMX6ln4mGRo\r\n0s2484ne8k9AiMBx9zDdI4c74SaOMMRLY2Qk4h6ag3F/Wi6b398y0Tp1TDDT\r\neTJ0ZIExzuY1JH+J83JpGJ/WdQDKQrjYFedC/rsaOlHNOs7mD+X2VE+b68bs\r\nSKJs1R4eaiYXNYqYuD7O8YyiYsMAfr0utn4nREfju7i/7n982RijDmIw/P3L\r\nZm8MB4+qJ9fEgVX194Ygd+3jE2YUhb9mG5AFgpfOOIiCmhx7FZFyVM8v0tC7\r\nympFoO0VMLODPJGqhVbOUZHLudoSYX3qugIxHdCntX1YT3gO6h0+Q0OI8A5A\r\n0jdtfnDT8qzq5XLU9FckRnlcHptVYEVWyJfeUmSis7AqzdCF1Br2WrhMY5Sz\r\nj2Jis+K/irdPCZ6f16/3KbfzCKjg6Ly9jCnBf+PZZgGVGIpW/23ALLLcS9J5\r\noMeWn0Ea2l/EUZaLFYuWP2V4jmpAFRIaJkVrilkCCepgvvBSgoXt9B9G+qDH\r\nQP8x+PgPIeCTzZgDB0so1E00+UHqrjiG7XQ=\r\n=+UZ9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-1e42665_1671645617637_0.003750752471202601"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-c153bbf":{"name":"drizzle-orm-sqlite","version":"0.14.2-c153bbf","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-c153bbf","_integrity":"sha512-U/pyeaCP6IpHjEOsDs3WMxLf81OtrL9nYNyyY+hqKftRer7lCAw0hPmH5bHNK+DJUQdKQArduUkQsSJqMDt3Ow==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-U/pyeaCP6IpHjEOsDs3WMxLf81OtrL9nYNyyY+hqKftRer7lCAw0hPmH5bHNK+DJUQdKQArduUkQsSJqMDt3Ow==","shasum":"7d31fd0526fef018c69077d63d797d80fe41a17c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-c153bbf.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmbAE0iau/WtmRdRrtzEEC7/nYnayPcyZ4zazMqr6OUwIgfaldCZnDlt5Ot4fnrnDLHLAMpm3E5G2j+2rCfg+DmCk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0uAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpbRw/+NQVwbMI5b4zLZaAX8g6atnBlGumwCO6McQy7oJVgPLTCaeAc\r\nqnd5Y6D/GA1VKdHpqPpr+s5lpEBIbvUXwjky/ApUz/Nr/kC+0MhSAspyRIsI\r\nTbVNdi65lbffodwQ0XB3wTFOxeQUD1JPBNlrgQW3eFLLPnGF+AMbq5OHI865\r\niTCasHJYc9y4mqm8EnL6iKGJWhS8602TdK9kWpp9xfeTcVLWEIGrjO56PWxU\r\nW+KRMeSFs1lQBFfUzLg1KYZV8soXeBZFS4GaV7In/dJOONNzspbSo//cuAnm\r\n99AtDgHDFR8mm8YZvC2PLY1fLjdsHL+BfpzCKdeqFmmH50XxmvwPucOV2Kj2\r\nIg+NYndFVE14xfMjnJ7Cb98PveDEOxMtXljAAgw29hP7OfAKrt3H84QfaDxH\r\nNeHNjvPUP4ihybctc4FF+Xybgluh3vHu/7/haYZvZkjA1gpicid1mkwpFUD9\r\nOFyH+PC7zQH1mrwRv4Q7AOa527gzjRH1mdVJK+jb8t24Nt5cVHCIw42uhtKQ\r\nOy5rHNb66+lKcRuNKQFLmfkt85n/PUCMJrkTjZWWWVinQYxfoceGRoXqR3AA\r\nmbHC6giapOIaRjJqcBz0QfvHytAXD1wkZbyL6XfounUTGe9zwSucCQRu6kTz\r\noc2eFMdjOox7M5+RE0GCMPBk+rGTbXisKng=\r\n=hESs\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-c153bbf_1671646080344_0.8966768032390353"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-e295848":{"name":"drizzle-orm-sqlite","version":"0.14.2-e295848","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-e295848","_integrity":"sha512-QkfAV6c/4L49gOtjYvxhP+0llhBzmlgEOvzvTJiaEFhLhEAIYsjYmngCwVBkhJJR08lLJ5SF0ZuL4uUW0oKzlw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-QkfAV6c/4L49gOtjYvxhP+0llhBzmlgEOvzvTJiaEFhLhEAIYsjYmngCwVBkhJJR08lLJ5SF0ZuL4uUW0oKzlw==","shasum":"960a1b9f99d3f47e90b4829f9e7d96197512cbc9","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-e295848.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFwl2J/IQ26c36keOOBGT9b65kvb7//C0fgexBghEjseAiEAiPZep7N6aY/SPCSjEAzMeEUv9iZBWPyiYPLZ8VrLybY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0uDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJvg/9E2f3RXoWQXNfLWKRCzJwrC03QkkR6W3zitt9AtBImfNmXpjn\r\no2cyxK7ZUoEN9TL+NSq+x6kTUrJtnFim1Zw5NJYNAfFgvrzDwSoBVdGCdjV9\r\nyhxYJTz0NwHsqRn62qhwmNUFJmhACkzueICBrEWNzRInPeOCyHWewVzDdoVG\r\njZ496Pfx7gxwI1K8ZWjhvlPkniiR9q/xH8/YedHZ6EmezsPWNbmN0cIFU3lp\r\nArTNpkZrwNAOSKlTDh3Z1JglDQ2Wenz5J03RekPRSFBfw+nDfepTZnW3oIB+\r\nHKqG6Fe9IhcWy6D4tpwL8gDdMerLLYogUtPGNkZQsBnTRDnI0JZ6QinkWwe5\r\nBxmeDGAqTJ50Dqnnqxkm4j7dkc0ipl/zJVHr1M03/eGgXlb/csr7OfAWwRpi\r\n4JWJkLb6pMhfIvQ8rWg1VUZIWAb0VjXc3UoEGA7jcKlQJ4OK3HysJaQbr1Dr\r\nbmaEz2FE2Wr9pCahsngpl1gbgxVNqXUfyCbVG869hDhsibCHeECNHn+Cpb7R\r\nNuOw7blJdJlBlJHs1LYmnbj3wGAZwlKBJoZ+xTgrYeXZHBH30lpufAnXOEmh\r\nhz9YxECewpKMtPALhv6nRY0EsGpeqevA9kqVBt75MEEAnu8lGpLQyMmBFAmN\r\nSvbX8PcUZjiS+0II0cPoY5fn7vp6GwJUTOQ=\r\n=b7nk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-e295848_1671646083446_0.119145199153732"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-6f226c1":{"name":"drizzle-orm-sqlite","version":"0.14.2-6f226c1","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-6f226c1","_integrity":"sha512-lfoK/9CpkYO/mZQBMON9cMhtf67W/7sErWOhBz175XyVYN6ZRkynuRVXrChEFi5nbG+2ofbkrJgJCYcJtA14fg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-lfoK/9CpkYO/mZQBMON9cMhtf67W/7sErWOhBz175XyVYN6ZRkynuRVXrChEFi5nbG+2ofbkrJgJCYcJtA14fg==","shasum":"66238b33c5a14328c8e0b1bcb9f1558385d31c22","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-6f226c1.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDio8CQL2pDxB7cqNURumwMpLIHXKH6LsedAr5LgRcXRwIhAMcKESx6hfMikW4agYCdNxnICCbhVSg+WSTSYOxRxMMp"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0whACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDBg/+Iad8NF2bXjAmsH9ACe59l8ygUboeslNn6247IqHFnXDYgu4u\r\nODGt/9gsSi1CtDJ/80ABdsh2ZP15oTb1Gv3wubVRB9icscHvEM4lPHeYb/Ci\r\nfRnoQ7kgV3uwNV1zolK/zMJUSRtO75AMvgvxK/rnhrVU8KX7RR4DvWvjJie9\r\nSHquvsKLaCTc3phOcYXJeKZeHjoa4QAsssixEgdiRj3JP34ApWqE8BWGwFP/\r\n4NeEfRnqCe1b4FErEBdh+hynsJuCoj1El7MMdzXG3kkmJjdAkKj3qiWITIhD\r\nuGSMNJgY8eov1feQeyxh3Ov63EBxLbdhgUM2zZn/DdxapRTmCKCRj4DBh1UZ\r\n0osFTkEhSUkQCYwWKwSZIdIh11vJGZIshAZAL8XD67ikZPBRbfoDgnVXglRS\r\nrwS43J6IiOd+JBcf2Dn9QOyZrtcSNQys7vIGjyoWnPwVjU/IjUeSqJuR/0mf\r\neb6TmczaeQG+c3tyPBT/8u4WEdyMozHirYRP3KfEHPC3VkvB/6CRAWFqSkGq\r\nZXwdvAUJFe/Oy8EMg37eA4exceDiqIv+fxe8RJ52vQmr/TRtLjDGy4pBarw0\r\nek30A7zf8WSAl7c/TCF0dJ4DrRZ77Gba9UwrQqtl59qqggEQSWPUooTXtNtq\r\nz/F6tBGOlnPXrtZ//P4FmKa1qIq5Gr2szNM=\r\n=qlpY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-6f226c1_1671646241356_0.8276391570944133"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-f8d0d46":{"name":"drizzle-orm-sqlite","version":"0.14.2-f8d0d46","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-f8d0d46","_integrity":"sha512-J2o8sQbSfNDoTuysJ4HA5NJMol4B7doHdSVePKe4zSGuAS2NXgKbTTeYpbcBg2R8ssPk8cfZPnsoJU/YBqTt0Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-J2o8sQbSfNDoTuysJ4HA5NJMol4B7doHdSVePKe4zSGuAS2NXgKbTTeYpbcBg2R8ssPk8cfZPnsoJU/YBqTt0Q==","shasum":"d958e5ac6162bbf05db6de8a105f993773760e8f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-f8d0d46.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGwM5fh4savvMIqUY5hl7926sPDx2lgJL/tuG0NQ/HiIAiEAvs7H6FbpX5PzUzCC1NXY8aQ2RvPU9uQiYO882mQkY04="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo0xpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoj5A//bGB71jLi9EuNSU0VscyLwTBdRloWCIg3OouvFRUJjDrLr+vM\r\nXllfbHnHOOWEngUu0Gl/Gk+cCjV4QrB9GWLP2yu07D3PLyrIj8VnN6ecV8HB\r\nChiTrhREs2B2ZlbayyejIXj2M3cxSgFhMLguzMeGHvBll5q57K0fo3D7sCqf\r\n19Ozn+rR6jgChcYreMV8YMpAKLODmfGLJIaKsdyJ7Mk5MemIsJU1MHzztJaS\r\npbplCyxzDpysZLqftHGmiLRRXVhEvNb9I9KOFh3eKAD0o17O6CSktA34wNre\r\n6ExPYhcjVyII4G5PtbW4cAiudC8RNW/4V7dxOJcVmTWSJcERZxk7YwvOn67P\r\ndACxIA89yiEzUQc1lHHBG8immwZ/BatSKtZJLEF/nkD5oIezad4xHnY0JofI\r\n7y+uMN18y6G1Tu6jsOx6oWlEoVKGu53fCNOEgrCOxHvLDSAEZiU1QlBcTE2K\r\nBuKNAuB8/K8XeHG9MA/EvjL/raYIjmr9fgPs1s8Kmo4ZE9MPZeS09hnc+M4Y\r\n8tqCJMtCLYpqbUBZW3fwq83ZkjefDonRYPR8jEidq7fWaexVA+bo54c1Ppjn\r\nBwAkDrBcJ/wRSJ3uBtNR+NLOv54Nb7kZ1fmf65A1Kr51pFnZSh69oDA6b8vp\r\npb7Sm1DGSTmcS6SwwoGqwY8m+GjwDsebZNg=\r\n=sC/7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-f8d0d46_1671646313193_0.31104400230380125"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-cce4cab":{"name":"drizzle-orm-sqlite","version":"0.14.2-cce4cab","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-cce4cab","_integrity":"sha512-SbiQQ5+WhKIK8wN7KoVAr1DiWIMDYYg/dPN+a+Unj4sNYBiS9nu+XVE9VpScyMQyBgv1fvGlE5q/5yy4BmT/lw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-SbiQQ5+WhKIK8wN7KoVAr1DiWIMDYYg/dPN+a+Unj4sNYBiS9nu+XVE9VpScyMQyBgv1fvGlE5q/5yy4BmT/lw==","shasum":"e986c777a1681bca630615095ee869719a73492e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-cce4cab.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHCQQXJAWnw5lDQQvo2WR0HtVdWCoaF2i/++zKCszICwAiA4Fcy1bLcEOAMTIYms+WVak8BPcl1fGr8hoAoH8vGrCA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo01GACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpfkg/+MNH6QC8cUTDwKRha0D/gs1EZoy18iEuNLM+TcukS3DxyvMS/\r\nOhh+Zz5WedzQabSRYqyF9NbpjZJwJxcAUyvqTjsBJEKWTDGbF8Fjepn7ADU4\r\nowra1gcSLKCeYqx2bBbQtfLZDTqYSBoCLy58xbwOPNqYGCEVbUQAZGHFKlJR\r\nR0xTZMD2jTOlLh0oCVvszSkSjarLtxH1nFZNt8AMTOGuMLrEjH79XzY0nNHR\r\nRa/QngYQDBhmbHiZFmPsZn9DtZ6vbgdhm7kupKbo3nkEZ7s+qer7Xts+wGxY\r\nC6sUJ+q2LD5UZAV3HF6rQmUfva7LZpctDki4cwpWkRi/IcOqf9FOoNMwmDnX\r\nB+uOUlYG4M9juRkR5Zle9VlnMiGT3/xK3bGXu76TGTqEhBktcMf8SbqBXXkU\r\nf3D8Gyg+WUVQ7+gYEiowB0YPYSeiWdgg/Qea8RQysrqO5mof2bEGNvcfsMBJ\r\nGBHE6FY/x7aQhAKuh+RYbj+4LTSELidJmFD+HRqJzzC+ZS5bxdr1LiqiZxkt\r\nNecMmrjqj/8e+T9j+3RxnAYsEzSVtniFf1qUQmaBC7A8Qx+BpM1wI86IFJX2\r\nYxDPRnwzK9eZVsO2POiKylNHNOBqvYo46SpsTxMTqQ0XrXNb2IF2LPG95w4z\r\n5jSMEIIzVIhjGzzXB3wjIhJE2CYEvr3mJ5E=\r\n=mz21\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-cce4cab_1671646534074_0.8946055466804506"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-314c1fa":{"name":"drizzle-orm-sqlite","version":"0.14.2-314c1fa","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-314c1fa","_integrity":"sha512-1L5+q2wF98P3T0K0LRdr5l/i4ydzFrchidJOgMqPiNabwPvU5LvaeSluoYmQ8JPPh/Nc1hvthshBcSQTqSlh6A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-1L5+q2wF98P3T0K0LRdr5l/i4ydzFrchidJOgMqPiNabwPvU5LvaeSluoYmQ8JPPh/Nc1hvthshBcSQTqSlh6A==","shasum":"55808758903de12d7ff731ff173052f3b287ab63","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-314c1fa.tgz","fileCount":117,"unpackedSize":187370,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC4wYpzJK4hvqvlzXX88lPw2on38HEK6xf82fLhaZNoPAiA127KrM7WYPzeQLZHtsCizWX4yRfuseCdbv/oJ2ugs7g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo1UDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIvw/+P+5Xj9vBRkaAW2vTTqmQ/P8cOy6ZwlaoPbps66Rksjq1IJpx\r\ntKVtScgPI9y1ojoQ0x+Be9inLRc9iWdUDnTvyxuwUsqPvo45ROzWKtJpmY8Z\r\n0X9zcfv2j9ML06H5XPmaYMmQWDn0mGTusHX8VMC6KVsqdglb9O0MZ8q298nH\r\nfBbnVQlPuFQj1+HYKRS4TY5EH/Ch44rw3I5XSLs1bWG/MxZb6xiUXZDTZ/7N\r\nuv8J4lmIb7rOEycznKqkVYmKnN/VzkxY9HWo5g9zbspApS4MM+Dl1uVz62CO\r\nCv7d7WCuaDQcfl6qoJDAn7Bg7EykbTDNtskUszCGI0cIM4H32s6BGFgQ2qW1\r\n03wby7c9tK1ffucl8HJAUGd1p/H8AHPHcO0QSvIurG/PfdggHYBOkEpCVSfU\r\n6pBof2CwnpXjBBuNKhaUF8sIfgBOgQB26cEJa7pNPcLoHYTDYF46bom/uBpb\r\ndTDwN6FotwryERMTTfHyPO4HPzeBSp+677uMzIbIbXasdKLvS8l70jsLrg4q\r\nviIx3drEiqPBYbIwqSqFWOSG8AczTn9sqhjOSVNjmF/asJeFncYvvvy+KZGL\r\nLg6+IjdW/Lw2ae8X8OhD9WfzcVnQmQyj1H1ss2yeIsot9rp+SqgeRqy4li3i\r\nd3WLWWlVCbKY/Ij3VDaiKe6D6UoJKrTBXRA=\r\n=/4Sx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-314c1fa_1671648515214_0.6940923739550382"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-b8ae68d":{"name":"drizzle-orm-sqlite","version":"0.13.0-b8ae68d","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module. We support `better-sqlite3`, `node-sqlite`, `bun:sqlite`, `Cloudflare D1`, `Fly.io LiteFS` drivers.\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-b8ae68d","_integrity":"sha512-0775yE0vnlPXgpwmbo799pNJ4BfRrB3pr2aThhhg8vm/MyFeCRDLLSzKz2aIyiX/k2WvwLhLTrzabBQVRU7Jkg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-0775yE0vnlPXgpwmbo799pNJ4BfRrB3pr2aThhhg8vm/MyFeCRDLLSzKz2aIyiX/k2WvwLhLTrzabBQVRU7Jkg==","shasum":"2bb4e59343da0951b2e60bca96d044830b8b491b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-b8ae68d.tgz","fileCount":117,"unpackedSize":192852,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFzyrwyfH6lAyMFNUUb8S/sZ7DixbVRjg2FpZW0WS7VQIhAL29pU2BptfXmjMMJ5AjCirUux5RFHBhgEQhBc6x/zdW"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpHMIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHiA/8DNerqeRnu/aTdcCa8qqyUj3qJBeyaxIZAsdQOdckBlzC7bJB\r\nORU7eBosVg0PobuHA5Lpvewlen/8E+UJih3bfGw06BtaC/LPMIle3mneCkQL\r\nSAAmZDXtZQHMryprR1iMll20ZU8PUDE/POUzSK+4l7fjCR1eJQ1DuDyuaOKx\r\nO0tpdqkQburGx7JjbHwrFJpl/PIRCsR+sX2sRqrK6421XRqqH4029YYCj6s4\r\nt1XY7upx4U+iyNg+hyEpFcroJFQ5fLeUruDTPXiwKCneAAeouaBri5DRjBWa\r\n+5ekmJHMkLuhdwy3sl2+McfINZW/x+2pYBryHDbAyjguKgQlURyYPsC8AC49\r\nfIx/EwKaJJZ0t8ipnXzH3AzHKDDOCdSBl74W54dLpSekJE1z0YjTQLFDzOfv\r\nrh1NnuNIB7c6qqaZvu8AHF7P2fl7hDwGWkszA0q8oxhcSdVlZ+EtSJbCwbRq\r\n4bacE7ODYR6QxDGjHUh3dDYB9Thw3nLqdfRtcsXj35fWnY8PsDUf7frzcCHK\r\nOAKHfgf84bk4mNvYMoUKs9GQ1TdIzRic1PQDVxydBp9hdUSChXkwDxbQS8dx\r\nlxBZrP0khWxxyHoVfIZ80ymitTu8B6rT8zxq9IEjVMpMQNNxSs9WNECLPJvm\r\nKlVFRGClq7/rOqW7XjFcfrAgPp2WFFuZxn0=\r\n=JnVG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-b8ae68d_1671721735807_0.6446425261273954"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-099a94f":{"name":"drizzle-orm-sqlite","version":"0.13.0-099a94f","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |            |  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-099a94f","_integrity":"sha512-84hFgfxxrvrUBWgJyXur3c9PotaSVfrtQAvpNJG+BbV206Q0+9w49PiyhAlz2VgFJUZawe66o9+if0IqCoJvAA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-84hFgfxxrvrUBWgJyXur3c9PotaSVfrtQAvpNJG+BbV206Q0+9w49PiyhAlz2VgFJUZawe66o9+if0IqCoJvAA==","shasum":"3c960720d1069918498f09c595d8417b5f341aed","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-099a94f.tgz","fileCount":117,"unpackedSize":193149,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLeapMfcr0cEjN3yfa4Vp/juN40PZBC5RoWFOIFe7JaQIgJ20mQrXFm+mZdgfBuDXe7qqs0kRJe12Vn27cOHc0x0s="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpHOJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKuRAAoXb+wGxi4yK8t3o/VY89jpHTrxPLnZ4R3AI6y20sKnWeqFzr\r\nDzP5IW3qfjWIwA6Ovt3wlKursuBbR/ennmGyf1cvbqEY0SP9khlnGPSR3gxA\r\nezOwdPYd3oFDsEhntjXuelTxL4kwA4gjDo8OWZB4q9rQ2pWEBB8B60jYcWGn\r\nH/KczLeTdkMougKqYqhDI4aqgm94lQG1WUHtkJJnW7ZnnA9IhoQ9qZv5SLID\r\n+LneAnahrmH1ljMVQnUA13CAUsAlPGb8J9xLcWovephUKuA4J1NAr0KmFai1\r\nSB0LZl+wucFbLDW2l6vrdQ5vvJ610Nfq/VS80XZxG/KjTDXnyNJJlr+WriEk\r\nrDAoJ4KR08qz4gI/0uZOkadOAsLBeDu3FLhOgRyEDbcO1pcHnshJMTP/KZAv\r\nFs1n8T7Rn5MezssMBAz8MhKNTe4FdDCkUbsEhaN1M6KNCYh9x3MCB3Hv/K3w\r\n6WBODVGczK3WKVRmOIpn+pc2Q2fUbN/KdwhFdW5k9zdm8UjIhiZWMgxd0jAG\r\nbsR1sot1238BDl0YKtMMxC6bV85c4mwbTc8cHv3DsiXtKhEjFErdltb8l8RP\r\nTghCYkHJ/WwFfnxq9Lukt/E7QsB4Uowdsw/3munQ4IX2kk4V7V767zuc78xQ\r\nHCfcLO8kv5VEJyCZmaSsbxk2EhVJ9Gp4Lpk=\r\n=2H7W\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-099a94f_1671721865574_0.5398780727617307"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-a486088":{"name":"drizzle-orm-sqlite","version":"0.13.0-a486088","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |            |  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-a486088","_integrity":"sha512-FNKR3ciA+r2aOPNTMrdCKr9CGyCeYaDGBEkooUu6LJk8G/MasFsabR0Ser4Xy2+ltbfhjIlYS8ZjYbBF2HESaA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-FNKR3ciA+r2aOPNTMrdCKr9CGyCeYaDGBEkooUu6LJk8G/MasFsabR0Ser4Xy2+ltbfhjIlYS8ZjYbBF2HESaA==","shasum":"f5af20bfcbeaf5eabe0321ea4b312dbc14995d85","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-a486088.tgz","fileCount":117,"unpackedSize":193149,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD05hBONpAHsC+UmCrkAzBK96VwFLJmwWPkQFbjhtexSAIhAMb9cQhqEVSFUpjg7nN2+sDInEovU4g7+Z7sFMkyYN8t"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpLvZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq2kQ/+JBOvawszqBe66tkz0E2ZLO9+YggBLnizrybfkbe5P9+Mr22C\r\njxXCaBv4EFY1VYJfFSW0xUndkL0QcRtdAtwh2TFgp6jtJp6MIMTbfbGCDFrW\r\nBMLhJQcgEVYuy0zX16veQBIBdf+MYacueAsG9/8T+MJZTKfhgIerDQ89hpVT\r\nVD4+8al/sH+LUaZqHMAACPEVyEB7qbubsrC6mw20tdNhbZPrW0TUDrADCjVC\r\neFVh4A+r9laY2fMKVPbXaLTDdi3aYcXyuNyoqZnajz7q61kNWkNvwKpTkaJY\r\npbEOIjyQZrlCzpvbYL/4zq8Dc7V9HDPUx9sAwEP8I0Cx0brGF927ADXN2KNy\r\nrZ5PjrSsbSrbhy7xKIidbC06+c5O/WL6hIp0+E9gU+MPtojFaOlmmat0ARUp\r\noCK9AGTSw/Ylnz+8rhsRdIbOzAHCaSt+2QENxsdi+d9NCVLKzmPqLZbuP8dp\r\n2788ig529Cwx3h6+oTxSfd6u0v5kx0SXeVItnczpSOXq8Uaa8R6heM9rIh8U\r\nH5CPgCDzi0iPgUzgm8wpVhyORI5wPIP64o3VNo1Z4gqf6DzL9j4EfV2SQQzW\r\nrniaYji3WkVUWRWBwYGjMtYogLzjmIPYS7UyXgrZ9NTsKL77sDOs+9EoxpZc\r\n99q1Jn9nAFLEyFMSMq1JxtXwQ7cRCE14L4o=\r\n=RLDl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-a486088_1671740376791_0.07287004447047396"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-d68193c":{"name":"drizzle-orm-sqlite","version":"0.13.0-d68193c","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-d68193c","_integrity":"sha512-N+7ZvUfBst3vUUd5x5booODoANBYW48PsefYp6GczWsAKs9TzQOxtqO/9eGPB2LrjeSZW+QvUQdUrfaUp+qvLg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-N+7ZvUfBst3vUUd5x5booODoANBYW48PsefYp6GczWsAKs9TzQOxtqO/9eGPB2LrjeSZW+QvUQdUrfaUp+qvLg==","shasum":"6d9e20928b4ce5ab58cf0ed70d0f482dec3ebab3","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-d68193c.tgz","fileCount":117,"unpackedSize":193229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpf6QpS0/izX3NucfK49hA8d+6T/FD3DB5IDPn73rhEQIhAMb58KD+MUZIJAdjCqfh9DFMsX1Oynd8N6WvGcQdf2uN"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpL11ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrlMQ//VhpI8daO1cnMrQg3ezBpIj77erpQUDIs76BI19BizhUFy/WA\r\nKYgkDAlBGihxwoV4Va8NjQgKXNICj/bLxFQ2M1WjozqJtFUINNXDVz9myeAg\r\nG8FyA1SSSsnDPrDSobCHkoR8dHeO6V+wrc7FkarpQrGbEDIKnH5O3qumhV6w\r\nMaUoJTSsN+hKY4y+hdD2QqFZLxrvW0jXnJA0/uxm+ckVkC3ZthYQBYWIu0xT\r\n0QjGUlduC+kyVdbHpAQpaafSBgkaROF3Hkx0GGHmSmrBUnv3GzhY/S70WwS0\r\nlDNPwd/2GoD3eW/lv/EvYgI6N9HJQ5paOiVBifo9DRIaICwajOT6Z7YIZToc\r\n4yLEq4zu/n7nMzDwFBd3zjLsAKTkHzJFAIDrgFI/z2JKyrA+Rp4TuFxV4Hip\r\n5rcKYyv7a/9X6p0lBiN92evqUpxNRKtKK/8Ncradbo0TnXIvHVV5qP6J+RBT\r\n8ck7ytNrPeqtYMFwOMpMx7VEw4JodUv0vaJ2LAXFPHfJBs0utbtOjKH0wk2p\r\nC5AxFPyTy6wSWouhhaSAFubwaMH+cKnHvv1sXeU0RjOgB4PXvyJ/fRaSfNK8\r\nZrBLzfOcQj30G8q8mHoqLevpKmTznORNEMqCrmQD420XPCYSxPHZ23MgKtDB\r\nQotE8XOST62BqgcPu6RLwv2L2MWJiVEoq4Q=\r\n=C7Rg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-d68193c_1671740789054_0.5547538293967991"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.13.0-671a09e":{"name":"drizzle-orm-sqlite","version":"0.13.0-671a09e","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.13 <0.14","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.13.0-671a09e","_integrity":"sha512-k1tzalM+NwtHuuRb2QnlfxxqDrRMtyuDCVW3+QviSpTl9RaReef+BPKQ9vZZOq6BrVftxqgtHFqzmRBSCQLWlw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-k1tzalM+NwtHuuRb2QnlfxxqDrRMtyuDCVW3+QviSpTl9RaReef+BPKQ9vZZOq6BrVftxqgtHFqzmRBSCQLWlw==","shasum":"e12a0df362e861a2f843b0f693fff9b05fa766b1","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.13.0-671a09e.tgz","fileCount":117,"unpackedSize":193229,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGozUMlXx09En5lbwJSfM5kLDXbtg7inc3d5bLpNcIkmAiB8lRMPwpn25gg6qhGPy2MMfYtlF3SEaU41qPRKjPrsoA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpMASACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryaA/+Jrx0gjv8r/j5EvLBVONlqiCF3ilcPh0b3kM/pyzz/87i9Our\r\nE/m8NmAVsgjEU4/WM5ma/3Y+XxztgwAXkKrpvPnbsRsl73+RDH2znGvQyzZh\r\nO6rWa9SKCK277iwRPsR1L0vVYhhJK2MNiglBziYc8SQBHImpqZji6mTlt40q\r\n5Rr7/909ciPFDuJcvcPz8rLJ+EP6kQQw60etbdnoUnRaId+d2RRBMk/ZED0Z\r\nBX494eN93Ghu2n+lmWCzby5oh0BQCyZejJ8HXKSxH3qgtMhy43MVgRGlcc0q\r\nntepwZ+XARija3TdGMYUNjxrmpjnzK2vSoM8UztVJcDxUZ/2PSpSBfdwGB+C\r\nDGRtHuozoXcqJPEKWhDE5oTTTYiklDdjHhD3eBRtYgyd5/kUTAQqhaJCGzN+\r\nEJixnHpGHGMBqvwht8r9XuM04DPDuc0U02B0HT6mJqxXTYGZTNhQXWpSDP0T\r\nx2uvAJiFYOBnrs6yeAzajq00qPnuV1uWyci6jteT1DaSr3PwL7WUnJK0prUe\r\nF1Mwbl5YrLu+gCwOawLotT6JrDaRQ5OC9y0q/oB1tYWPPnkRhM5pTvvI7qW4\r\nHivxKkNZh/p+rgPAy7xS6vsCZQ/S9b1rFU2sqcLRdJHUPaw/ndJTjpXxUzuJ\r\n2Gzx2c9Nw9MHwYSbQu85mUyL/x9bXZKiMD8=\r\n=QjE1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.13.0-671a09e_1671741458428_0.9873770741252701"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.2-5b14ef4":{"name":"drizzle-orm-sqlite","version":"0.14.2-5b14ef4","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.2-5b14ef4","_integrity":"sha512-+WIqMZpwiV9apPmBZzj0WURcfw4uPita+hfK6epxPBz/WrhDw7CbU3I3twU9DqH2WJT5E0PcBSCMYLWfF3oKvQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+WIqMZpwiV9apPmBZzj0WURcfw4uPita+hfK6epxPBz/WrhDw7CbU3I3twU9DqH2WJT5E0PcBSCMYLWfF3oKvQ==","shasum":"22c8969077b1f48c8f402de6812f8dda66d4bd0c","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.2-5b14ef4.tgz","fileCount":117,"unpackedSize":187747,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBPXRBGVEEHSjnEFeMU45yUmC7yK479dsBB9s1pJOPxTAiEAqSiq7RqlmoSFJc71otRtHYyG1jSoge5l69O/MNMNKkg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjpMXPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLrQ/+LKcwDqr35oYsjeMSqAeiCG4sGxvsj0Cv842hLxzmv6WhdVU/\r\n2pLxqiFthFIJ7RWzYepgfZqcpRRxnDbbbxsP7GnYv1kWwx6QyD/ZQVOpYIRS\r\nJGQVv0RpZIxoFmPofl235jjIpgcIXWP8GMXTlA7MjTDZlrDVtiVoCybh/lZk\r\nW8iiKU+1dbORyBd5HtZG1eOm4p9wTA2QVSLPE2HkTjIv00Llh3ICUvYp9EEU\r\nytV9zXgtdJxaoG2OpXczd1swPd5Jgu8tbLysmcRyQzyZz6AyZlLOUZaKNH/y\r\nfC9n//P/MMBt0XVlWGe1W26mCQ/H6yEd4IGaDmVGQghFLo2wqmH2iSfl4jbg\r\nbfSSmWbjCmz2Vy41LUEnn6A2WUI58F7p1IHira/bHb3q6Z71u+NTfs9bqdXW\r\nuA8a9OccF4zjxWGbdi9REXcoSGV5BnblsJFffjUZBErWvoq4jbtB0TvaKHMO\r\nBok3siSiMASC/vDi3b+CW6OY5BKXi5FuRuRuA7BuYtoxhwITi/ce6XOE5jUV\r\ng0E07X21FD86lBh6jHV7fYhtPvGwtfxMGraRhA01rfDh60lFFxlqckikOQ7V\r\n30ni2RHfmP1pKNbeOG6Es+FbOd4njrc5F3ZHuCO+Ig6uhQMXhAylwgE2uUlL\r\n5J7fd/S0438QWg5ecZchAqxuJFnlZw99LJ8=\r\n=tNa7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.2-5b14ef4_1671742927481_0.863232351013983"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3-9ba6169":{"name":"drizzle-orm-sqlite","version":"0.14.3-9ba6169","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.3-9ba6169","_integrity":"sha512-nKTyV+AzBXnWAln+38nR2CUnCmTA6ycEg3cG/hqs8GbfDvg8QqOArvRISlXACEzgy34tbUhqI0aPINiYAvEHbQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-nKTyV+AzBXnWAln+38nR2CUnCmTA6ycEg3cG/hqs8GbfDvg8QqOArvRISlXACEzgy34tbUhqI0aPINiYAvEHbQ==","shasum":"e10a786ba5284e2e220a2a19a1ee7a0f021856d2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3-9ba6169.tgz","fileCount":117,"unpackedSize":188314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD5z2ee+AYdowbyDhp0Ox6NWeS9NAxUA4z8dIvo/LfgUQIhAMrGKBv+BHK1wV3nMPdhPvLH3sgmpuTF+jayRjnXSWOI"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrXrpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpYPRAAh0/58v0DzoagkkESQ2Yb4SvgF7cU884c/wdK2WamTndDRAqG\r\nml9rF/jQA2/e+mHb2e0XbwmSIVcH/p603yTAf4VSmGJQJFNI+DOf/sGtdakq\r\nhB/i5NQ12NXymYZ0oVy439IUOOBV5vpBjWGDf3649hJDokx3PxDtaPOz+TgV\r\n+7b0Rq1ce6vSn8z785Ju1I1rK9jw1awbJNHn9NsGdzN7GwEjSTMUFXZywAcL\r\npUBjCibZW1NzD0bpsew2ReMe/vEPHP5tAE5PzmsxISboM2t/FDLL44vFCaMc\r\n4Sp6zrhXaCNdEhfyO5N4K5raj1e85scZNDh2L5ZL8v9GN/nikAkL2IIbRVIm\r\nvHAvwOlSex8xLrXfyz208TdpDfs+9gGVGC6i8SG2zSKX4w39298DRSTjOwdg\r\nvE7m6u5Uhgu5tNUJsdX/YBgkX5c3KTR9uQdSPkDu0mxGtavLQzCEMXhXgN5h\r\nePMVojjrnEZoVbq1H17upxZNsr1RL/hpwYz16d4f/vUxPdpIoJJnOGPE+u6F\r\nWqRBpobnJZ4kZwdnoAN7n30CZ8rhYhS487uLw4p0zgKTjOwpebICcjE/Jnt7\r\nv9D4nHEwaJ0zcfbvAvBoC61eMc1bYE+uyDRMiHQkMVCmIKnPwZGaGWJbi/4N\r\nzjitP3AD26VCe3o16Rx5ClR6b+Si9gHgqfo=\r\n=tOUJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3-9ba6169_1672313577478_0.38611724396385094"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3":{"name":"drizzle-orm-sqlite","version":"0.14.3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.14.3","_integrity":"sha512-/eL9zaddpkMVsBgSlguRQJm4reRuFW3k8B5tP/p+4hBIO0GnTJEv99ienwEnvK6SDy781/fPUPhYa4PrSCN93A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/eL9zaddpkMVsBgSlguRQJm4reRuFW3k8B5tP/p+4hBIO0GnTJEv99ienwEnvK6SDy781/fPUPhYa4PrSCN93A==","shasum":"d1fd421561bc86b8a2a94ae4ff4c22535ae82986","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3.tgz","fileCount":117,"unpackedSize":188306,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDecL4LP1zkUcjjyJdj8pb4JnaO0rr+CU/C2EwJtP6cGAiBFWCr4MAZThMQ6l5GzYGzDSKm11iap8jyWBwIo7HVbUQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrXyUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpjew//YvA7J6jh80OoPTPXuMOYJKC0SuYi2/FClyTmTt0rfFbRHYy7\r\n1yRPF73gmTCrUE06UrMhVL5sIHx8UtTBoRJJ6P5H6VfqJWb2+njXQnhW6xer\r\nvhtMbeW0p9jhHqtH5hYVSwcC3L2/0Z2FGPIcwkMVUCvjZKIFq8zYSkbG5HEh\r\nnqBwugm4LdcVhep2TxkP9wE/+O0puwzw/FPwBE8DbHJnokGUFMgevdHeJLzQ\r\n4wcKq3TSjg39Jmk8SHup3QjUGqhee+gBbeJVyYZMQg2+WMkDssZsh1SmJxU7\r\nM19vkqdPRa58eVR5CfTdtqkwg8kClOshwg+xlBIET8z+Ott50lH6twLuG0BJ\r\nkHeDOm+NmY+8LWXoFiogGnSceMXZTs8EwmSQ5SqwKcyQZYFi1a7eCdFy8O8T\r\n165YNpmsuaeoYzq5snwiBbQhAxTpjKtRjBcySSb8jFsX02t9xG+ANsrwHcT2\r\nosRRosr8zLgpySkQQ0/GdkiDIjZpjFAJlYI/v2bBd64m2vrWPNUt3cP/8uw9\r\n9diVuMadHzrw3kUAbo9KoZhIQr5syANgVY4Wt1dO+JnWkWCXP4U1XWjRXpWT\r\nrvQHWvemdpXDEXzBahOA0wS959gT35o6KmIfRdg9pEZvKIcuLwxB6K/8bZVe\r\nboRFpvk5inxqGJPt/rIJYjUGaSNhW3l9O1s=\r\n=sUBU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3_1672314004289_0.8756596702709663"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3-5ce7d69":{"name":"drizzle-orm-sqlite","version":"0.14.3-5ce7d69","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.3-5ce7d69","_integrity":"sha512-Z1ddsn1VaCYzI5fbtALUwddVFM6UhLbmEeunHGM6gmtkemiwImkW9lMn+HoC0elN9U2XcFJnw51F3/eG/lk6jw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Z1ddsn1VaCYzI5fbtALUwddVFM6UhLbmEeunHGM6gmtkemiwImkW9lMn+HoC0elN9U2XcFJnw51F3/eG/lk6jw==","shasum":"60c1cd8de83566857f672dbc23ffbb5f5818e6f5","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3-5ce7d69.tgz","fileCount":117,"unpackedSize":188314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+m0Zj1BVj1TynGTKUNJjhozbkcuLSdtiBAZKJafC5sQIhAMfevVKiBGeBHofgRCg4vlBUioyXnHfISBiAjHm+uXCm"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjsyZmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGMhAAh5D9/gsjf02eebpd2ocLN2KG3TZ9KmvJC+K7O66ol9dY5WIS\r\nrjTHlhWSDqWQ+BG20dyLxxjy1ueiiF5GtD7pek2RrmwhXb5NbAlpDQqkj/5m\r\nT/3JNqhMoiXvQlxdlauRb1CpvlP+q795XtDsFP+bYCuvdMx/vd3T41xBjrs0\r\nEolRk0wQEORV0b/pFEsy2F6WKMXoQ4D5kmXKO6bSVq3zsyy48xcD7eLbC33I\r\nka1nA50JsXAu8pOrKRWOAI8hF2+WGbmbEY4NtrTl1GOW8I65yMTPW/yxuInW\r\n7uMW3XeEDe4opN9Bl8jJzqkixLKiZUKxfX3s/T7dBsagtx20PwlIe5T3j3na\r\no2o9MPHMvXzp+1NgwoLXkcxlRY0FOKVWzKaHnmvgYuLq5AyxN5A61MmqNytv\r\nOeFQlv6gclyiPkpcL0/OQyC7MFnCegOagzbp1XUN3qXcbMuJ2mYcq1mo9PiC\r\nkVePF5GVzmeHu4LgSWShwj5HzHz5nKIIpe/FMIMPmb635BYlXKRG502g35P0\r\n/vO4K3QUT4KYOY/j4PjC6OJzR2/lHMDUGI9mi4IQGc65zEBVPTKXLOACfz3d\r\nUSwMU+sZdzrYX8C3oMPAjyd6IwemC8DzziMXO+YNqmq821dWteKam+wXk1JW\r\nafxHnJbeGy8fj1DHIs5H1jxqeC6qDYtahnc=\r\n=h34O\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3-5ce7d69_1672685158368_0.20507729487543847"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3-4e3a5b9":{"name":"drizzle-orm-sqlite","version":"0.14.3-4e3a5b9","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.3-4e3a5b9","_integrity":"sha512-o+sD1WFQvVzzfpVZ6+VlzImuuWtjGD3gCkS+4sX8bjfcX02ymyyG8cCEJL+15dbSzM/UAxq2NtHYv+Z99lbomA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-o+sD1WFQvVzzfpVZ6+VlzImuuWtjGD3gCkS+4sX8bjfcX02ymyyG8cCEJL+15dbSzM/UAxq2NtHYv+Z99lbomA==","shasum":"03d0ab97168a3845987fa0f88585560a9ee8e361","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3-4e3a5b9.tgz","fileCount":117,"unpackedSize":188314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJcVdOK03GH1W2aVbtvOjQci9lXUDaZnV0NrCWnPu30AIgEf4wll07i9GpqgMitPjGhE3TpZ6zSOXrfJaxYJjqcXU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtrViACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq39g//XdKAqJ/5RHHVYyluz3CAvfEdCBChjAunldM+dke7rDroBb9h\r\nbg6juTrzOIyIXREwRCfZNxSKibeXHBsQ2f+1EbCvfSNsaE5QgTZmrzhqbAk7\r\nfx6+Psb2yP/b4Sg9FwN/Zh/i/TNLkrS5FYjGKSuNai+KIPnOuaMttuAcVV6z\r\n5SCdpQXIme6whPt482V7VOwod1ZgLqOih4MaUWT68Z0Uq/6RXfum3/lunCDZ\r\nr5PhF/QBG/bvNZATFD+pUw7OOhPbbXOebCJFImaDaKwmMrhRKPa98KCqGSJ2\r\nlkU4vrEizcr368QvnuVUtqVTk8eG/z4rnJ7yNSocH4J/81KY4xE/87jFMAgq\r\nq4RoozKxBRVuQpY4WCu/GqBoAVvhqQZkA6c9JWDPdI6WY+r5Xse/isYAOpMI\r\nW/KLsj1fa7zn2m+tX6/s/6cGB37M3MuCq2ssylZnMILVl8ryTeTT1dVIoTbX\r\nsj2q7v4r5S2gzdXz8vgaQkhw8XcAwBUAwbZnvK4ptHPW/UoR6fEO4cI97yzM\r\n7ef9wCxUrkSXiJ3oaommzmN70PLkvw8Je/eqJlKdlojjCpbSDMQmcPlB8geC\r\nhmBZFx4eeyGmQiTy9ErhlzgRG1Kao0OJ9a6MzkNWqNo06Hu1e6ioM0HOT0hx\r\nf4Ryh5r4eBREPI6tWRLk9+vCopqn/dgFvP0=\r\n=Thox\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3-4e3a5b9_1672918370345_0.062288213653656"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3-dd27c86":{"name":"drizzle-orm-sqlite","version":"0.14.3-dd27c86","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.3-dd27c86","_integrity":"sha512-Xzv2tKCxMYfzY9/pHhHA3fkDja3n987ThSuoG+cI5DnjCrOpfUF9uXNGISHBgSjCw+Dk6U+1l85Ph0GBVDr2yA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Xzv2tKCxMYfzY9/pHhHA3fkDja3n987ThSuoG+cI5DnjCrOpfUF9uXNGISHBgSjCw+Dk6U+1l85Ph0GBVDr2yA==","shasum":"dc2d046b5add3e48e2e069feca4d1b670bf73b34","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3-dd27c86.tgz","fileCount":117,"unpackedSize":188314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1JiDH+c9CNlRjFqjL5QSnkRCJSXsdzSIMwMdSK+o6TAIgEbD0tnXmguAWJcz8wBt/VvAiBCgeodHXRrs60e9SwHs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtuwAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoA+Q/9GhpBVet5BvlOlg9HK8rOfl/WHn5rvtAGTo8drJXsGBESp64N\r\nm++77RTRSVCOeyDdPA8iyFDrjJjva3yN2b/Np69+AEXUov1EAtsz8kL3rcef\r\nEC0ucJIb2DIJj/pg4sE+bGkvJnVxJ+dOTcSWVgGXIkhgjrO6TOov8VSUcRNY\r\nY1HLHonuEMC4JWZQmnKyPgmIU7hy//I4tmSkguN5yVeU0las23CB6GFvwJHl\r\nyJ0EZPCsMqHjhYa4m81F4MhokgKvbvLX97DhM4nWw99LipM+/Z3xrrWoe5UJ\r\nOPo/LbPdJfnRxuShr0WuVnLy88ARFxzd0UZ7Ni7wd5g+WEuF2d6GnSHT26HY\r\nuVoEjPLu1D7u3TtO/QeydVuUVp6N8cuW5rCJj+tVFfaVSeMLNjm8oQrl3ldK\r\n+50zLz0NR7aM6JJA6CFL1jjN+1Vu8DaoLhcFMM60xt3ThPnp67fayrxzi4Nr\r\nIAy0u/y4f3Ts+yDR7elqQOdbqGuj4TyVyG/uODZ9ohJPS7MgwAuDgtfqVwe2\r\nwWx/zSNKiNxnKj4f+Mpl6TJv3G8McJJdMVohq5eXIVQsQ3k/qeu6xcrAYNlL\r\n0jj6P20Vd2hNrEn2N4ZRhdijpa30wkPp+e5MkpOZmmhPIuPBdjoIF2apUIlc\r\n1DjZfkygRwxO83x68oO4s7h2EChAk/shLRw=\r\n=s8OC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3-dd27c86_1672932351900_0.5080489560435235"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.3-67805d4":{"name":"drizzle-orm-sqlite","version":"0.14.3-67805d4","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.3-67805d4","_integrity":"sha512-X95RX4qFsvOfsVFDY7Hm5mvs3/EnM/ZH7KC/6/z8MS9/xK1RoLgEFRt6AUsiUxWI2YW3p6Jo469K6Zewe/EfCw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-X95RX4qFsvOfsVFDY7Hm5mvs3/EnM/ZH7KC/6/z8MS9/xK1RoLgEFRt6AUsiUxWI2YW3p6Jo469K6Zewe/EfCw==","shasum":"99dbacf72670d92406efd083432727b4fb45842e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.3-67805d4.tgz","fileCount":117,"unpackedSize":188314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCD4emcYdG7v6o05Z0T4DtticUcFHPDUMc9uhShBLLAbwIhAKivgGcSk1Tt7SQ5xac2VyKrXptKJqsqNDDfbbhfkAhG"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtu31ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr3BBAAkH1Yki44ZVceMTz2Or32ecPlTZci0Ky9jNIMw1nSVE2B1+uQ\r\ncZEGAP6zgp7O8AstjcsVjKLrlJabuBPH6Pt47+YtQskybC3AkAighUaZ14Ms\r\nSfP+Wcm57Dl2LtBtztYOMR6mtobwosEEmLgc1X9rfoiZDane8UApAAU3/wGX\r\nd3gPKlz/wjM2zP9wY8nXmrGuQnkT8WIN8Drl1uQ7oABLpVkf7WHpR3u2TnPH\r\n8pDCxd67bS9B2M9AflqYpKBCbIYdygmtwEVj4FN9M5OmRtnio2mxDDF/XXrP\r\n8NTJjaYNjdsg8siuXOb+YEcUkMDSdht7TgF7x+05Gjj994MJ07ThK1l9A0yH\r\n0AsuYgri4xWrzVuuWS/F6cBH4Ufn8thJnEAdPawfudJtch6qJr6gVmnAJ9f3\r\nzIgaxnCUcjYMor9BHVh49BqAPDZVvmFdHQ8Q+2+gYcz4k1tRK9Xh2crnVZxR\r\n0CTElIpEPRHYguqm+HNR5Wg/0SLrsZ5m41T/TabptsRiafGGTQpdWa25h0SJ\r\nB4lxy1YUiTRwN4oaW0vSHXWI649585B73PdoiiEB8vGzr55W1eOaYRhR41lM\r\np2BfaL8bjhtpWZ6peWWoX+Qv/uojgkeBnNzD+MOxRl++i7EmqJqBAhb1zZ/A\r\nTFEW8EL75yndLd8/AsyGORu0eXdQJskQS+8=\r\n=9YxQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.3-67805d4_1672932853144_0.6711751547432885"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.4-1bcee50":{"name":"drizzle-orm-sqlite","version":"0.14.4-1bcee50","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.4-1bcee50","_integrity":"sha512-ZcO//gV/Yg/ohtr/1RzqkDQGtz/tmAjtgDhcic9yUJvTlFxtgeJ3s6GHOfSf8M8f6y5JpenkPeLfkb+qHqsMPA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-ZcO//gV/Yg/ohtr/1RzqkDQGtz/tmAjtgDhcic9yUJvTlFxtgeJ3s6GHOfSf8M8f6y5JpenkPeLfkb+qHqsMPA==","shasum":"53c841de41016d84986c5d43943d2f9a355a2945","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.4-1bcee50.tgz","fileCount":117,"unpackedSize":188298,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGGU4po04GV7gnhO/fcQ1W35Y5nkmz+6aBaSVZu5k88cAiAm/mazD4GygFXFHTysggc0utUGCGz61JjRLn7xi/T/tQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtya2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrf6Q//WqTnWk36qG4P0Iy7z698T+g3BSM48JJedPDwEXgTvQ8xefiH\r\nl0cC4AegphmnPy9bfdguiQm5+ZslCLEb+nlvNGKV5FJ0JWWAathIblUTAaq5\r\ngBzs7+VNX4TKex1vwMUutWOFpo7vtDS06CCNGiXF45fSskyoiLZOyv7besB4\r\n76J8l/QKNCuFGVsTIifl2kaDZe8Il1zqkfnRB4dFxiW1G2GynVCPkhZSvokL\r\n46HweAxCMRebXMeqsKYI6U0wCgU97uIfNHjiZE7KImxtyxlewVeGuWF7aO2J\r\nI/y/VL+9KTotZmU9K8Zf6Lv5xNacKO7a6pOi9/Ksd4lvbkn1vGtNQuj7In5W\r\n7rOwigptQYHd4RF6HtZtiCfxNINurRgMmgc0DtI3OA6naZdHy4UgUG9A+XZc\r\nL++Tq+DB9mgZSuM+ZEkkuop4NEhSw24gKSqBwo5fL9COH0HgCyzT1JeECQyZ\r\nF6BeZ2AkA7GHd19bh7gIigbdArMIXK1i/QafKkUXOEhxR3oQQMYcYE1Yig47\r\nvHT6I9t4o45o5DGSbwH4DnIlRL6OI9YuGeG9Rq5lkjQ2a/DHpYnXB7RmKEQY\r\n8Lw5InPJsVxfLwuRjTxp+CM3vXzDfjVuUy9DJ0drRYHC0FtmhIvdsHrBem25\r\nEF2wD0ij/d3RXqrS9zpAZOcXXgNXAI8Xo8o=\r\n=QcSd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.4-1bcee50_1672947382130_0.4844849910417619"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.4":{"name":"drizzle-orm-sqlite","version":"0.14.4","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.14.4","_integrity":"sha512-lq42vr3jBQoqlgyf/WRcY6/SrN+h+EMnvQ0JUWXj/C34ZDfWtjBpiJ9dX+uEoqM0ITkNvBTA6Vd9EHa7YxDIZg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-lq42vr3jBQoqlgyf/WRcY6/SrN+h+EMnvQ0JUWXj/C34ZDfWtjBpiJ9dX+uEoqM0ITkNvBTA6Vd9EHa7YxDIZg==","shasum":"534d5a068ee3e472e5fc7c5011e1b4b98d5f5fbf","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.4.tgz","fileCount":117,"unpackedSize":188290,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOqC9qftTg8g3UhmzRhAJquE+Bg1DOxgeZS6StLRatAwIhAN4ymqxaAW39RiQO/KUwd6ixkHuYxVewbw6XfG05YERz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtycgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7SBAAk+a40+zIUr2hbw82RFWaeEY0TDOWV7TKclgRbG2Wu2oL+OSd\r\ngGmXZdlg5hUAEQMgN3FAOqYDOWyy92igzCO4Eupwtb3oMDOIM5WdAeaykl5r\r\n43YZCLR0T6zDV6f05OzmBtngfrBTnI3rkOW3Qd4KrV84plHA8eXWq0TqM+8J\r\nPoK5FjKjYriTdBZZeKzboMslEx75MuisEUXJ3LRjF6l148okVuEqE02VUkOp\r\nwgszrIunYD6055Hz88Mp1FZxJLmuzdfCPuosetfUhfwJoyj+5kvwq45izHLs\r\noiX6D0sf62pP+TRdIPnrUqsqk5oIZjTmEeWX5GHvOj46SG9AK+SjC6+cmWjL\r\nOktdtYkrpBZgLjF0SBm6G91mas8dZAB0CHIPJuE+6ZgNYXq+/HS/5T4VgsPa\r\n01pCcCBMh2NsLKPmPSxZVNNvB8ZwNs6A1aN3/c2VvrxzqTTv/EgdPmpfs/oA\r\n8RLsQk749BNrqwvBTLjaOFdVaUPUL5f2t1Uny1u/ldfG2CVcbu8PKt5odP+z\r\nlGiBNUdVJbC2B5aJk2JxO3Gt3DH6952EqSLmSDjVX0woK2GUc+MJsiiU8goH\r\ngW7NgCeMyc0I6IzY8aspZNMt7G2X/qJpYOF2NsnNSEmKlEXAoQLWQdy9Xnv4\r\noysl2HZ6LwHa9exo0B1rOjsR7f/+E4FJYFo=\r\n=xDX/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.4_1672947487960_0.799186675569479"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-07f606f":{"name":"drizzle-orm-sqlite","version":"0.15.0-07f606f","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-07f606f","_integrity":"sha512-AZt6Qb0MfU1sQhlcvPeIs976XTfrMhWLrE3TL2fXsryIqff/pW7V/EyAV02GVz52U3+682PIBj3LYfTGHvjGsg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-AZt6Qb0MfU1sQhlcvPeIs976XTfrMhWLrE3TL2fXsryIqff/pW7V/EyAV02GVz52U3+682PIBj3LYfTGHvjGsg==","shasum":"e25107049b56eb08595ce90720e93e4f1e25d1d7","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-07f606f.tgz","fileCount":120,"unpackedSize":192391,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+07CjoeC27P2YkYNZpj/64JmeFChiI3DaDjr45XjYBAIhAKCHFuWvCEeXq0yn5bIFWrmeT8u5xZF8TNVvKONSMuUo"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuDC4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrYkw/+O/UCdTxECJ3jrnYH6lhE7mf8TnvTt85GNajtUqz1I4LxVCqp\r\nyM8sl99SMqt5oa6TfBitX6DP3WLW+7oC1U14hM28+fT0oJ16GXWO62ega7nK\r\n9myE0d/nBapnU4UDjnSSI/OvD2O2P+r57EdkPi/Bwtab1Bvg1hv7PAq8NUOa\r\nATOrl2cxctbwQAsNiWTa9eeLD6tCz2+UilmUZU1wDPTHRBOXbeFHNrNG5W9e\r\nAQAoWXcShP7wSDwvi9u1pElfNILs87lae8Pjx7ibSusLm+aEujjxmNRL2Vy2\r\nYeBcbFV6Xz4QJj/YwIblYLnoCA/aRUvFxeH1lTrOxB6zVfM8gH3wu1wHn8x5\r\nlc1CqAtMuJZ4Mn+E4KqQnP7a5LvUDuHVHxk6Uhaz2h8OAIbIqJDlgQcYGkrU\r\nyB/ydG0GuCd6Z4/7OsXlp6WZnYRtkJ/Oknoky2jTAL6vdk76ptCx58LF7Dn9\r\n7yjQNjJmmYmjtWFBsQNazuZ+KDnT5rDCdaK2gXaWLDF1vqTfklkzcA90fq0+\r\n0HyWmZcEhrWL0Ug5kWczrz/TGZK8MR+bE81wMGXVJparwGW8tqtDm350kQBT\r\ny32oBpUd40R4L0c1XXnPT/Fv8Uucb1YGVsitSAvF3Q4b8vLjHxyHEl/8RUzC\r\n+5yFT0WyOV+cJz05ot916SxU7kr4jvMzAc4=\r\n=CRbG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-07f606f_1673015480410_0.7116073213645795"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-a90d3bc":{"name":"drizzle-orm-sqlite","version":"0.15.0-a90d3bc","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-a90d3bc","_integrity":"sha512-f1t7pTIrCM7jp6S5cJ4qGtmpqpC89nbXJ8zeEYHSfEDDFSN2eZsY7U5/rQovrhl3gycnA9HDOYXzZNXLkAUYhg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-f1t7pTIrCM7jp6S5cJ4qGtmpqpC89nbXJ8zeEYHSfEDDFSN2eZsY7U5/rQovrhl3gycnA9HDOYXzZNXLkAUYhg==","shasum":"e3780f492200cd071db5eb7dc2a08063fd5a10f2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-a90d3bc.tgz","fileCount":120,"unpackedSize":192391,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJzhzx9Ht6UMx9r/G01YCV/DzIzudB7iwtZGxxUZFLMQIhALc0edx8KKuvC7TzWcAKkJQiv9Mdh9iVY/tPI1MM9EHh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuHCBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZrg/+KgiL4gYGsolfK9+g1JUdZ4hjj5SJyqfyjtIyRmxlx8oxbXFg\r\nNiHKjxUKKQAXXYeT3bcbdT9y05Dj5LobrjYDUzteVHh4W1EUeblQ00+lwhiY\r\nAgULwbAvAWk6e9yD6OmDTZD3KTZMl5jeZRH5nAAVHOOzEC9JGrg7waxZCOEf\r\n+QfFkAiajKwg0F5MhVY4RWV7d4k9mSnyPmQRNGDaIh7a2dAJxeWva0u0NTns\r\nGABA30W3mwVeZnZ8pxy/6BOjHqx+s5PKskVhPW03mKnGs2/sTQ5oTh+buKLF\r\nAFIH0qA60nPjQvz5mcXiXTvz/VfX2J0EHVevxBP0qtewWFxhHz/71Mz7gLo4\r\nqk/WunvHYRDxAP55uPJ1zO4lUArGj4YM/kIl+1KNahlUf71v14xqVcWQdg6+\r\nxJ57+HybBJd+DswXq6ZX0tgH3LVoGTUGuQ+RXazi6ajMkYGvgM00ADzvXaUB\r\nDvzy4WYrfxf5VzDOMAbaqo7eyHQNkZYsN+j/2OLCISKt3EsvYNY3wQ46CDza\r\nTWbDa6nH8q1vtI+MafyggubI9kjCEcuag27uUioPQSzEW3ORBCBX4j0YDKFX\r\n+HsAyWI0GnkGu65NfltCI825yo06hojEpB5tKLlYi5u3BbLRMtaJshF/pHL2\r\n0+1LezOCKGr0tYQqDl1NM0R0kcO0cvi1vkQ=\r\n=MJ/j\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-a90d3bc_1673031809747_0.3151309960159121"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-7d17618":{"name":"drizzle-orm-sqlite","version":"0.15.0-7d17618","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3 <4"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-7d17618","_integrity":"sha512-wirjDpJroxse1lm2BolkIcHP/zX7TazpSW6pcUqxz3LziaS8pbEcn0txh4hMU+Vs3E9gCYlBnGyDwUPBBTS6dQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wirjDpJroxse1lm2BolkIcHP/zX7TazpSW6pcUqxz3LziaS8pbEcn0txh4hMU+Vs3E9gCYlBnGyDwUPBBTS6dQ==","shasum":"a1d65fbeaf5d84e4838d7e21dd86ff2e5d1696a9","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-7d17618.tgz","fileCount":120,"unpackedSize":192391,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID35U05EZ+DNdPLvth1S4kY2u8by9B3cbRNBF17DJvx7AiAfR7LfCwCiwqmXuitwmt5tjiOdaNPQq0pLT15KqIdOTw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjutP2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoYuhAAlraGIcai1Hql32cv98ogsOJNRSRZhUVXSZnUdvOdwCWVeL9Z\r\n1HCC0K7UiFBt7tGO26/PIT2V+j66L8zO0mtIPj0loKbtos6VzvH3MuCYwGLb\r\nRNYblc65GJ+YyQ9D3fgs1J8A/k7spxc2GgeczpXBjCrLdstj0FMIyUk8TZG2\r\nGKkmr4ayGJabwftYtzEvY7MQVXRlFqJGR/1dKrE3Tax4drWHOLuWetZQZxv3\r\nSn7cmGq+1pG2wyyfUy/uLnpL/FJhqNB1G5osWcbN8Iwu5Xq5e5IqM7Be4lNw\r\nGO2BrNf1u/U60flOToN+cIacufWGehDEPCoyAq63p63i96mg5WP+jtwYGM/1\r\nVaD0WCeWduyUcSKHjC2RnRjWJ2wznCBAhHUZt6A1w/OdzwVbABr2z4NOsLAU\r\nkOoHbaF57zMxsG2E0ForcxIXWZY/mayYIJj0U1PKF5owtRGs/OUpvoy9tJL4\r\nbZ0VViJI7acgPML11Br5MNNsoiz9UbWzPyEp3roYRGpfwvguZBzHoF4t/Vls\r\noIL+zR1gLCvtnlEn1vA/Pp3+weq2PVmNwv374V9+47e4AnWaSmv8nDkxv+Hp\r\nRXagpVK6dOhMcmXSQxayh6tUerDhNwkUN3m0Xxo2WFg+VsPrFChNK8UUndd4\r\n58XCqVCU1J1zqQwxAaLDqODM/KN7GEKHVQI=\r\n=hZN+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-7d17618_1673188342614_0.2731134693064914"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.5-59f0a3a":{"name":"drizzle-orm-sqlite","version":"0.14.5-59f0a3a","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes and foreign keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.14.5-59f0a3a","_integrity":"sha512-13/xg5/S3WxVxbnhn7p8RIG2OaOEIKTkRlfgKVqrK6dup937BZQJzBEywRPQ1aDQ5Bee/0EJGuPz5BdwZnbgTw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-13/xg5/S3WxVxbnhn7p8RIG2OaOEIKTkRlfgKVqrK6dup937BZQJzBEywRPQ1aDQ5Bee/0EJGuPz5BdwZnbgTw==","shasum":"566f9ae82f9f449f4e092d031b0bf54e1d1a757b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.5-59f0a3a.tgz","fileCount":117,"unpackedSize":188307,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDEyOAKTwTSxP7ADQWj7SgGelL/tFxjEm55Tbv1mKi3fAiBPg4EWAnMqZbfE5ulVwHJy8CvV610jIKCI3tj58hPDiw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCWJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmom1w//dzBlEIrYIxU3ixERcfzX1FLTzLA04Wrsiv2gvMZu82oQbXKu\r\nrRw44+2npLXkeEdMBgJZ66Evb6lxINwjphy56k4xGJ+W0glMhazUfPH18u5w\r\nzz76Y9eYOL4wr1zSMNjgaR1buKXU8qCIBUJ/AaRDOrqGMeUKa7wIYNX2jgSk\r\nmn9eixO0eeKDTz77gXStVsSNX4q2sQyZB2iTVQUSuKKBL3AQCFtYU2DWbA+O\r\ng8k3S2heVhmzDZirqGsJ5BCaT6obPrI5Iq9CjnDREaAYhH04iNaW7VrEJtZe\r\n5sQhKrCf4pGv7xHE4ywMSOEE8wo75Y+K75frZXy1IEOIYGZ3+iYlcwHIkRnY\r\nqdoFyuedBFFzwniGmCLW15ZD1CUShOi5XUwauw9cftgfK+S120TQv3BY+P9h\r\nGCqxSlBjNrhQQuuzxxMZX0x60N6N03mFUIwwsXh+gQSBYsG+78mI004amD5/\r\nlm5K13WReHUALBcW5kNXgho5glYKji7Riy4tyT5zAPY+wA02fYdZ6bx2nIUj\r\n1zF6i7my3gTjo9pEmRRddGqRqPoYNukQr8sd6U+aR258thn6cazuUI4szDYy\r\nFPxjIh7FfkcnFXxI5F1RovVR7T3jfYVxRH0wwmForEfjRrwV4QqLL/boufZJ\r\nSIQ4pGW9SwJXBsSFn/ByqpZscDEgTOpWDlU=\r\n=2wBB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.5-59f0a3a_1673274760827_0.5053522523009883"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.14.5":{"name":"drizzle-orm-sqlite","version":"0.14.5","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.14 <0.15","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.14.5","_integrity":"sha512-YaSlBMQgwZwcA+579RT07XUYnXd4ApCgoyoijY5XgEreTxdU4oUd6XOcYIfy0FrI/PAJQgczMvb0pfItoJSBNg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-YaSlBMQgwZwcA+579RT07XUYnXd4ApCgoyoijY5XgEreTxdU4oUd6XOcYIfy0FrI/PAJQgczMvb0pfItoJSBNg==","shasum":"8ce4b11ee4881added5079014666c09d93af29b9","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.14.5.tgz","fileCount":117,"unpackedSize":188299,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGDR8+n+fpX3c6rQe/XhkqEIyvj/9cVjQLBerOY82VdpAiANZb3zpbSLP0uaaw2oO8tZuCXWjb3ud5t3WOsUYETYNA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvCZjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8UQ/6Aw3qzRqbs+mkNDt9V0ESgZwcbiIjOsIml9ZzXJ5PpDQZwMWv\r\nUF7W0qb6DhcmEBrk7iTevOp5G59ICmJ8ttsaCbFner4wl+1MVCs+7gOyaHpM\r\nnth01zbkI6ZgfYjHpXGmBlqd19SLPbryfJ/LF9wnMhh2WZ7iF7CDSpu7VRVn\r\nUpx+07B8m3MHeTEVAY4QiTxoVFWrQz54ddwZ/ri4cxpvIvf9UGIxXneBLIrQ\r\nnmKbaFDH1F0MEMj0H541MTP9SqTeX3HEz9AZqWP/II8p208teR4LX0lpqf4z\r\ngcNrYMQojYBK7zJ0sDUOvYV+XmXCR31cEvg2gPm73Mrw//1aZ9wWlgrY9dcu\r\nVKciS+I5qPYd98UXIH6fkhsumVkIiQMMc+gqcMvkCbj3rqn0l/reqnt3sFQV\r\njSWRAJPTp0Qc+UXqa1QkfaNDenvhRxvfz15JOEaGXQEu60jj4RNgR8E+KiTX\r\nXeDUEi4X22FoNc1uEO/ezfR9ilDKzh4SgkdQsVHij8NH+m+DkqAusMvwACPH\r\nmrtU+lGeEfvlU/EubNK6KLAw6erIeqNpGnhrWJVnFvWgRsjYZsLz38Z6moxA\r\n7gimwAD6fqe46gStUDUfS+HLxA9ShInWOgiXALub4KQjTJpWREwI6b4IGFuA\r\nGoIKwBaZpRmE5TekVbdJreW9ozHrG9gK0nU=\r\n=w77b\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.14.5_1673274979291_0.33073848368252"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-2e1e5b2":{"name":"drizzle-orm-sqlite","version":"0.15.0-2e1e5b2","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-2e1e5b2","_integrity":"sha512-wO686nOer3mZ6s10x48q/ACcRiUpcNXfBwW2z6JNLYw8/ibbuON6zJA5tGWgSWE4yTJ62y755zCIsWwQu7OpyA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-wO686nOer3mZ6s10x48q/ACcRiUpcNXfBwW2z6JNLYw8/ibbuON6zJA5tGWgSWE4yTJ62y755zCIsWwQu7OpyA==","shasum":"fc371e4d3f9c65ce399c2ed0acf81c040343ebb4","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-2e1e5b2.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBHLX4BYJqYadsUbEPrLci7wOG+vYeZYhGRCQjbqbG13AiAPy5L1mKtrI8gXLLqxhru0wbLQwG27vHyI5walbkIOdQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvUtWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVxQ//fJzG/WH48JMDgbSd/OybnpPAFrC8hVeBNCEc8SxmKkW//lks\r\nFFDQkx7vZIQTQ1EtP7nQ/YwpFAAcgjw1Z5NmuX37aBLuvsFXHDoJJcuKnkhr\r\n+hwm/3E5loLWPzJCihtVc8/nawGVsd2tMq5fCcqatSdKXiYrYcN8xZoXsk24\r\nRjndukr4v0kwqbvfGNaC429D/YijhAQmTeR+mbP1Tb6ctXL+uBjkUC0posgt\r\noiwJmyWwnMI3uXFE9gKXzWTijMa5O7MwA7R4DCcxvTVdDA8AosKopCpZDkb7\r\ngNAO/RMMrCHIHs0ksA3vftNkkKAlZeFEvuYa6U32unBxAnGe9ZJzCELqBA68\r\nGRodMY25BymHi4sWDZc79d/3cQh3LrCnMjvKt1erVY59z9tLP5PQ3Qr4Nods\r\nCd0e7WWGfrYjazypc9jql3BXHehgBBcValFeoVuNsuMWD6zXDz66BtkO3QEP\r\nWngVRm5EWY64CCm+jGKugjFARJTFxCJAjrCTIQFbAsHm68BvOkNEwi2bLf//\r\nBKcb72/5lNMLf5RNoOJ5fn48AfL0nkXuFap2mlt9ium7O53ebKAdZyD/T5eY\r\nBGHy01b9D4ur0BcIe5j4cIYgUaNCZO/mHRgeSIjANnoqrfUFnCM5i+pEUjCz\r\nfxr95gVjnRvq8PrdMLApD0mmzW+8AFTxwPs=\r\n=64Ti\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-2e1e5b2_1673349974000_0.8992087401061446"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-60954a3":{"name":"drizzle-orm-sqlite","version":"0.15.0-60954a3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-60954a3","_integrity":"sha512-aqYWgkJ68pe+xDEAA72uH30B7PGYc2vRTiRUqMktf3lI/9vUgExf0cj/QM4XC/NLMu3ZQRmWW89oHXjvw4NY7Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-aqYWgkJ68pe+xDEAA72uH30B7PGYc2vRTiRUqMktf3lI/9vUgExf0cj/QM4XC/NLMu3ZQRmWW89oHXjvw4NY7Q==","shasum":"34dfe8a2757df77c89f76fea2b036b99cdf8baea","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-60954a3.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFFDUiRhT9ba8N+GoFE2KRY+EPntLY57MSgwQzv4YKlVAiAHZk3JUHfByJD1Pt7CjIaCpV2PqQIqpD9sPswf00gNjA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvW50ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpexQ/9Hl6vlbiMIoXNyU6BaDPYbMW751wSOHSKHkeaKa4Re4w6Fo3d\r\nn08Y+7ihCaC/z1VzNKpOwXS8bC32D42L9vAxYFkvcl/+lR6rAd8PbeSP/vpN\r\nKmsXOiWTf5lHzVfIg0PrFBX4vP+olJQQRCMW/NfEzlzej0nl3wmX9owMaAzg\r\nBPgmb3e8WvS9qdRPBCyAV67YlJuBuxsULAfVqT+uhkXZP+zQ737vWEd+ClMU\r\nYXpcD/wX0BAAo1LqRz/Mt8aLtD22ZCZKpxnhaJ7shGJJ5h4oVWrkaqe5Z03e\r\nV7GzGCKv2NaDvm9IVwdFdImS/1vQ884dBw0abb2tPZaOYeAgd51E03fuiGdJ\r\n+PCIHSWgYOUB+AcDtPZo8/RB66eeG2NEfun9F+JUWOxNaG56n1VwOhQAOMI8\r\nVYYN1oIM6of7MvF1epAAKbxSnhRqNKK24qsQAZ4K3PaXzv2Tp2HoqHF8EKZI\r\n01SOq/hzZE5tCiN76OY3xpxXvVYWkIl8xukloSznUbxr3liSUQJU4OtdjE/q\r\nyR3Ik8kHALv4ZfjwdRxXP5TwQ1PKXSLS8Na6Y1v3lxxBeTgcq66ZyubOSwn1\r\nrqrJ9OFApR5LOkX5Clx4YFRUsKfxZie3ew7ynsBbLWwpDp3zUc1L9B+iEqUi\r\nsC5NOUyv8rBaW8Y9FpQfDydq2GuBiBWfVbA=\r\n=eyOp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-60954a3_1673358964705_0.6406620406032937"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0":{"name":"drizzle-orm-sqlite","version":"0.15.0","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"_id":"drizzle-orm-sqlite@0.15.0","_integrity":"sha512-p/D8QpKCqwXa7wTncCviAth7qEuxm2M4Y1IivmYfsKKgzT+uWl9ig1j/L7oX9DU4cLhL2Mej4ps+aWXjL4umNA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.18.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-p/D8QpKCqwXa7wTncCviAth7qEuxm2M4Y1IivmYfsKKgzT+uWl9ig1j/L7oX9DU4cLhL2Mej4ps+aWXjL4umNA==","shasum":"36f36764ff161789921bde2c299e30c6eabb1813","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0.tgz","fileCount":120,"unpackedSize":192392,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAOKrbrwr4/cfyXYKIhcCU3zhryTUd3P1SwHa6bYh+TjAiEAicVh/dv9AxwMxa83Y2hG7AK9UwrEPZK/kl9Ukcea014="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvXDkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpLQw//W0Ms5JszS6McQnNxmhsB3cGGzZNFGE/1qqVlk0EsEY30vWdv\r\nxmjQ11ahv6HVBgWFN6WA954er0TtfzryvumTdEjNhglaO+X2OwFbnTaCQHjY\r\nB8bfAzdnY7KpeJqJWaOg0NgSF9r8gtVKEnhSRHzyioHHesORBDK7hB3Nim8K\r\nm3Pgs+Oqe6GphNKdt8ZFlL/qnMm3jRrX0Zwk6FHc23P/dEfjMKCETCTLO8cl\r\nyq1Aj8xkQDtfdDpfhAhVLugSktmpRnlZIqJMac1j0mg2ZLhGmChNzjP/xz3S\r\nvlfS5/pAQX6JugXKfcP5jwvsvsJxAa9DW8PVLilnVv9YJ64aJkuWw8PZUekg\r\nXtRYetAiuqPzw1NE8n9YvDFQMrjnnp31bxdQcBGA3mqloaHRP3skMa3xg7LJ\r\nvkjmidQbc7vVVfOflB7J+iQOqZmXalPU51wwB77MBggysXsj4k4bKl3dvcWC\r\nlpZBOjeivhQc3qcvG62PL4i/eOeJHbq9XVbwWNUF+l7s3l09jOLwabdtMdbQ\r\nTqJyq9ZN+QGO0YxF9iXzI+v4Wt29ljW/a3t4dqug4fQGNoQhEcDcIrlGvMpZ\r\nyfvVyD8TI24Tk5p4yqk95gTpr32KtCe1iI3O+Jy6FujRD/eQxW8IwPIPn0pZ\r\nZOT3Ff6mpVeY0ULlmUT6vB/8lrMG76+DCz0=\r\n=1UGj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0_1673359588481_0.23936578974655864"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-88523f9":{"name":"drizzle-orm-sqlite","version":"0.15.0-88523f9","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-88523f9","_integrity":"sha512-7XES0/LeMxRvsp6/pCn4054soLpK/iff8gh9l8rXcEFpY8CEixGkLHjohgbRuc+1w/CQWirpA/i56dmpfB4apQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-7XES0/LeMxRvsp6/pCn4054soLpK/iff8gh9l8rXcEFpY8CEixGkLHjohgbRuc+1w/CQWirpA/i56dmpfB4apQ==","shasum":"0a65c9c96dc9877619a1543d65b600a3a6bf4b9f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-88523f9.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPlJgXPaXeVRyMfJ+Jl2iuUS+vTcTAG2I4oYX1JdAJzQIgEgvdCDbNiIhth4CsDuzfoPFGtAKksVDcqNBS+Wqlw9k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBGBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrUZQ/+PFkNRIPYLgGkDRU3W9TsGUHQKrpzM6NZRjdxZ85cJcYKsO9H\r\n/dpEgKnYtc/7AEvc//n7X94BwBV7FlFskkT9U6RSurD59Mb7yKwLEGvQGp8X\r\nSFI+IxjJXF1a8ObV02OJwrn8fQKFPzus8/3iGHKk7iJRbv3Krlv8sFScROPK\r\nuf/D9JAQjZ02xm5Xxxe3RLK4EakaXFYW8QIArsAAPvTrcAMYaPs57N3bU+Ul\r\n66E1FyoQoKH0HJkvp60cRTc9eUmvDMHb0GKeczn2d2uLFml1d3cO14iKkKv6\r\nmG/sC4hQOAxt4vTgOw1Ot8LCg9wHWM2w0IzNDS4iOpZdN/WAnxJd+ybqV3qI\r\nLIxBV7CKYPC9SrOGY/tThdcFHG1cLLxjGk5A4qCB8iTarXX9h2PZr0XCqAsv\r\nARXoykmmXWiFxlObbz1Rt7U3L3U12g3GEGfeZJhFAcXs7ACWLvv8r3s7hjJF\r\n/NYcvytJHNd31W4aUFfHhbMhJI7nBIMdY1zLCDxEO2EG3GLJ7nPdA629/PoS\r\nim1hbazQ0EOZsnq6wS8lCgVCqGd1ECHgGQkfaH2ieU82VvxeeLkRfjQGqHS8\r\n7cXcPcqRYnzoG5sfi/WC5X4le8ZyW7PsS/DCrq0CEvHRNUaTcrUp017PUKeM\r\nh62BvwSTzHqnEkVJMv4yunUK3cUe98Je4aE=\r\n=YPj0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-88523f9_1673531777595_0.3771169964739558"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-f67dd9d":{"name":"drizzle-orm-sqlite","version":"0.15.0-f67dd9d","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-f67dd9d","_integrity":"sha512-ED+76+Am3QLUoA2+p1uIr2GK5Z/WCLNoM87nYHZ7q00KcxXkS3MnJ0oZE3d3Ztk1NgMSxANoyAZpfLt+VMI8rQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-ED+76+Am3QLUoA2+p1uIr2GK5Z/WCLNoM87nYHZ7q00KcxXkS3MnJ0oZE3d3Ztk1NgMSxANoyAZpfLt+VMI8rQ==","shasum":"36d7f50bd8320cec09cd654d609779018e192801","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-f67dd9d.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVJ5djMvw9Ngnxv3WFJFLJFSiupOsFdUjSxCBg/wPXJQIgd56BOEaf7+GJAwgyY+evrIKZ1Hvkr+ZvPF71qIdZIRE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwBzJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmruRQ/7BfuCvz5yDRBt+w1N/7WkTOs66ZywPHMcERp3nUINL//FQMFO\r\nE4LQ9ZGVolxIILTiP1hmFtMLFTgXWPkAGmtrZUZnqrfb8gZJY6apmruLp3Wt\r\n60SPrdiTB9VDWnqo4QEXnoua8V5fqRO8/HJjJwzVUgCjarQbWWMBY7ot1c3K\r\neOH1RyOdwBJ48IVIcZ4djBDT6OkWBaAjEryoZ+LKF22dKV6tU0Bw/X+uUDrl\r\nHTAy4fFzYlD5PfJ2pFbFab3wzwC8d98r5aspX1uCF44rkbHLOa/jUFqMmvAB\r\noUzxFhER3OGqXAo6p9gyY+b0zL0ZlN5XKdeAku9A84OyUjgWVFexdKZQ10IG\r\nX4FbJhoaOIVvfKnLEhWnUl8LJpQEebMIWBQZHkBzmSpNicjbrGUCLEfn1koQ\r\nRRod+2M2rccV16LzgBbiGCQOiK4C3AvVL9xjXux0D9qdgFQl7TNvX/2fK03g\r\nqCV7/zWwZ1D60Dql/rUAUaBVb2DQmiuq/MKGowe77ffApjqbVTVnT3AGVXrU\r\nOmbYR6OfzAWTUwjvgZ2/sQunDxY02FSXw8ackATIxrzzf/pI6QnI5v6IW6G0\r\nHNRiaLkaplrAUg+rainBhWmrhv4ygRzTor/7dA22NCuvNisND/BLdVzNcS/Q\r\n/+RfNBqPLPXjsmEtjFoEoUssNkcqbEGffeE=\r\n=YMCL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-f67dd9d_1673534665124_0.7772487602030824"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-80901ff":{"name":"drizzle-orm-sqlite","version":"0.15.0-80901ff","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-80901ff","_integrity":"sha512-PndGbnszNyWtf/LUggJb44e7w6IrVQEtaVDCM+dpNj6JH6JDQmvJv/UStrwhcGy6x914sPNGA+EMPmscebb9aQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-PndGbnszNyWtf/LUggJb44e7w6IrVQEtaVDCM+dpNj6JH6JDQmvJv/UStrwhcGy6x914sPNGA+EMPmscebb9aQ==","shasum":"99cb59b52430a59c89733ff8878ca19c92665693","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-80901ff.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDrQChroP0CpYBVNs90FAcSgzZpGyBUyEf1wrnSB8K+sAiEA3hasoegWwSY3qd02Mr/EqnWjPXk4tSnRxM0j9I7reXo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwB2DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJhg/8DSpyq+ACkGuEJUfjQQkV2dw/oaNqWKmK4NO0uarRClGmVKrX\r\nqT31A3PwtPNDw74OXZEiR3LrTCL4/R9P0yaEWCNsO9gevbrp9sU4XEd0eC7c\r\nMsm9565vFsmpdA9GI7uhO2QZS4HPIzHS3tFwfMIxubc/77qTKZsXJyy3Jvvt\r\nBFMq0kVvpSetwDY/NB0TG4WQvVlohMA7l0x1dqFpUloD87i9gKBebo4z1PLj\r\nhTNjs+db+hBfPrut1yJjU3poGUiFM0qi4omR7Q7dU2uCrUpXxmXeE+3HPjAl\r\n4tX4FRgGa0jr8DkdeiazrSJIn31Mn2H6DPLBsfQOh6EQFQhVtR0ew9vu3wlW\r\nOgWCFQOadBt7RgqjXon7eEakauaGysNPDuemsfrVEnJqBd4CLLsujpinWgAh\r\n9W4mVCFXZI9FLxyw3k2FhgsbDXQUFxGS4hrlgpCoV6gHePbWdlswpZ7ZCg7L\r\nIcCkf+gumX5sigNID6JLBYMMqYy64mISiJ95NOMykJ43x5z+bzi85+Z1FLTr\r\nj8riGVro6DNGEiAsMi55G3OE+ezKUUTAABiDB6hcjZZVuVegGvDq9FlaoK4w\r\namTtNxMZySAA8JqCApZup+yxYn6NtXyoo9JXlLRKNAqQf53Ea4qljcKYYmJy\r\nwzb+AWvDviinKX23xFqIJCHfdPHzC9+ks8c=\r\n=CrjX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-80901ff_1673534851738_0.8157012864374431"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-4a5b2e3":{"name":"drizzle-orm-sqlite","version":"0.15.0-4a5b2e3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-4a5b2e3","_integrity":"sha512-yYmgb36oCZIEB6xgLfBVZC+Kt/A9DUfwlFXGY1JzZZim5evSbM8Ubvi42QPlrEGcmC+YNgRQe4BbSe+Iie+SMA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-yYmgb36oCZIEB6xgLfBVZC+Kt/A9DUfwlFXGY1JzZZim5evSbM8Ubvi42QPlrEGcmC+YNgRQe4BbSe+Iie+SMA==","shasum":"9d9671d27cd5f6266618deabcab430037ffd6960","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-4a5b2e3.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYoQTiGUQIrpZqOiuWQB2sOxiLMD43STOJSNlnHT+MGQIgNqGkMH0mzVCxWBHtR2InPRBdBY0YWswGrB2v1JrhTFs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwC5AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMkg/7BVP9mrT1juxUkIPN3c0TQZtJkL7p5jXho+/++TUrMySiYF7Y\r\nIIxCZVZXDthEU/Ko0Wm7D8d6BGF+L1n3wPjfFFgqOQT82UvKW0be2/I+OcTb\r\nvxp1ksAPLU9L9JN3nw9xaVenvnFqcvw1Av204ZFZ2jMFA2V/5rtDA52VZwZO\r\nws4/BO8zP0m8AME9Bz3nxKeQOoXOpKFF0iDnpME7Ux7hD27MwnBtDZB1U1Ca\r\nEBEyrLowFoXYJjFbmbLwL5zIj2hiiiXeURQXIlMDrmgfxF2V0lo4XLuPzLWO\r\nvdDv+b9uo+8ICVl4fO0O42j3gG/WL3bOHksvTN14IBIQpYJxKfI4b5kBSA38\r\nRy6Um7cGkEEI3qYPH0+s70rXZE0IOBftlrrrAmnyZ/EUYrAUq/Mg77VF4jzH\r\nbuSD/x0NsIDcpMotcdLnmLBHYRaP6Sr/hylNAiZNBrV8tcI8oMv0rtx5kUkt\r\nxNFuAu4VH+vvhewE2k/J/vcZgoFh3z0NC6XVXzD2nkJFb8PkyCGi2U7R1WPB\r\nCxG652UnJonZGS3KsoQGMG1T1sj5OCPubJ2+6lfW3sm8BYlBOD1EtAcMOfis\r\ncyJNsTHTazAhNKdEWm+4q2M8sozoN3IB0kxjQpweOs5k40g4pmC/Sboy3GJ/\r\nHM6XOG7lSRYR6YyK/4LuHc9KJgxPj8CtXj4=\r\n=Y2z7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-4a5b2e3_1673539136060_0.9536678242552294"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-9728cc6":{"name":"drizzle-orm-sqlite","version":"0.15.0-9728cc6","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-9728cc6","_integrity":"sha512-bfi7aoOy5BmyrkSHO88vARTUdGJ2DWKS4QmIfxByS6iDlFaQb8J4lw/aXchIcztaCILxwJAoYxUzc3VTN3U8kw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-bfi7aoOy5BmyrkSHO88vARTUdGJ2DWKS4QmIfxByS6iDlFaQb8J4lw/aXchIcztaCILxwJAoYxUzc3VTN3U8kw==","shasum":"bd0259ffc1031cee9162e522beead31351e6897a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-9728cc6.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDiW2Ww7Yg7eR6or1xBMLbYhap4ctrGDGCKJGs1bXSIxAiAVLXE0vx8uSF0AJZrqq75U0EougWm3p3wA/LmLkP0CzQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDbRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgbA//QIWqrahgOCSdI3fnoGsYE2mdbQfRrqa/LSDo4H0Te/svQFsj\r\nyCnkLUeJxqQsN1nT4nDeIFgnvbuNfUXDcy+dVbFsO1E9TWrVMj98elZwsVzn\r\nXr8Omzyt4e1ElBQ6ExYmzGwXe98v+iotTygUYfaZA/XcLn+ozylwCo7EoOKV\r\njGPn8QggcWQjJUhIpF0Lgc+Ow+YIROwl/c4GSz+R806fGu2SZs02+JYxm69A\r\nrEHz2qGCZo7q2yCxE9Bh9SugLLFq0Pt75poCuuKphPQNGjIPYK4RC7Kr08fQ\r\nFnEmIajatBsvhq1VL/gRjm2THsWVhCl4MbEbz85REWhLcACiAmxLL656uH7g\r\npyvaqsWlK5f4X4Vc+cOMEq4/dGEUM+YkWLavebS7xAa21rSynQLIwAFaMC0u\r\nsWeTYYM0RKw3evkedyy8HKNyFmKiH6m3WQZ9Z4aLf9xAYSekkciYcrSYlRW6\r\nkNeBP/ZgMbQ/6C/CpfxbDTIJisW3gBB555s+Xk9UFuOFSuTkXagQoEF7jDEa\r\nVucy+RE2Q8/EobHstZtllrVU2ej1V7AEW/gygliOhdH4RNGmuUlNZ0N4Hpyg\r\nmL/2WuKGp5p9A3bkStpDMbrPTxk/fQo9MoOf4uBPyVj8rqeb2jFr21BfqXUY\r\nIAi4ab3tTi9hWnMMZVHGQs9u2yhHh5SsCaM=\r\n=QHNp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-9728cc6_1673541329714_0.12267901633845968"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-19c5c02":{"name":"drizzle-orm-sqlite","version":"0.15.0-19c5c02","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-19c5c02","_integrity":"sha512-zZlr8bYPg6hmMc4h4E+20x9LoqoQh0XRJTd2k7DU0bMWGbycS1bD/4PICRC1GhcHjOXlRtkoWRZnTKBAdeZk4A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-zZlr8bYPg6hmMc4h4E+20x9LoqoQh0XRJTd2k7DU0bMWGbycS1bD/4PICRC1GhcHjOXlRtkoWRZnTKBAdeZk4A==","shasum":"27d32a0221b611a73b6a87bb7992186208aac9d8","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-19c5c02.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6XqcYY5qZBZXQ/ZSW+caMfY1nK7MUXtUDI/oz6BDnuwIhAJd+wT+6axLauKUsbUhgKFJpvLGcI6bo0m2CNkuSGqHq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwDnlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgBQ/6Ao1Xxu0nplerIAMbMtqh2E/f+JH95z2c9Uv22PK6pinsQGfF\r\nAUxdOmre0Tdju6KDLt76cna7Enr2MDbERARAWsoQKOkQFKB/fSo3DY7HgksZ\r\nXj5c+ut59ZuldDmYUWSmVYbJ78PZX7RNfIyrvKz1AqxpuJ2VsC/XGsooW7Xn\r\nEIJPLE7dxVqUO0/c4tKyBM1NlxqRdJLrU0OnsyWNQypfRr+WVK/o4cWq6Yo7\r\nkxrclkOz0b3BlM1AbUSAg/DSuIngfatj5IN/0pgso+qmy8jiMIbQGk69ErPz\r\nvn5NAoykWQz9LQDg3RraAXbknKj80BxAGuYuI32kh3d3ssITHNIbLThoem/p\r\n47DhzUx2W5e2pG2ZnIM67AgtSsov6Y4OSOMCEYt6kXPzNC9dHjhzIUZOpvyA\r\nBjJEYQapAfAzxNaxnpUo9H/uNltgsXAA74EAEbNglS19Rix4ywpVvFKIM3tb\r\n9OA/2Jfwe67ey3KGityEIG+g9ys8DahVSFH8hy6ZihP8gO3RMhKRwFSOoeLv\r\n64qZR14Pzk79Z2O7dptKmYNMHQbJIb41AwhDjebyZS7Bvg8ikCB14cvfcH5J\r\nwJEPVKI9b/Xlk580DdSX0NmO8QHBh/5oEMc1TABLEUBc8LeAmUF/5c7q7oS8\r\nWpwPNpvWa7KZc84LhB5w1SRVTtAqoQVl2cY=\r\n=nONy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-19c5c02_1673542116839_0.8085089766248137"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-3548c99":{"name":"drizzle-orm-sqlite","version":"0.15.0-3548c99","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-3548c99","_integrity":"sha512-Eq5qcGUtXDWbdkluKcE7JfZCT8z5Del3TPJXPe57bFj+DD2kXqBJ5izUfRVPWoFWnoIdgo6HIF3f9nbLYL5C3g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Eq5qcGUtXDWbdkluKcE7JfZCT8z5Del3TPJXPe57bFj+DD2kXqBJ5izUfRVPWoFWnoIdgo6HIF3f9nbLYL5C3g==","shasum":"80296b37cc6fd7ecdf8dd68d1067a08ba780cd7b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-3548c99.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICD+0uQfUqw0aVHR105tI/iXUTjORnlyUWDaU/X+sPkWAiAj8D1gwg2aKbiulIKDK4DUz7XdcUEwA6DxfmLE1RbLNg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwEAKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpPMg/9Flsg64U8Rso5mtcJUrH0aKX9JKvmP/ZJkJSsYpcdo4XKOovs\r\ngqG7Xz4iJPFlsfO2ZsmJAXGwm9gShx9uS/0eW8fu/y1ooe93lcuy83O3oyrE\r\nDLeo3Pl1P+yz+khx/xb8Lv/IzbjgsiY2OS5i7YbS7hp31QHcy1IAlpB41fQB\r\n40+VrByskv2VTiZRm27JEY6JnDQL1Li5C1J6NNRVHeH1uUZF6ZBWcWpPhyzg\r\n/LZbLsOCYnyzia302pZiFgqLuQWoE/QRU8y75rCNnDEW9Z78hjVsAC1GkQps\r\n/L8AK2FJUoHuEbYba90p53tr6FQSbCXZU5vbMh/F85fvj66+plOmfn0OgBqS\r\nyJK3gcdDjbledFTEhbIqwx55yCSYj6O9tYzG0a4NCogxF9Wxz9iawUosnIGR\r\n0GPg6U+ZR004+jvWHBQpU4ve6HLhz5zRkkN4O52dLwCUVTRr8SKr+nWGMFDk\r\nBQeropclEPfReEiIZhwU7t8s4QCgFN7Es0hFUXwuE7lNGTiokTNYcZiaYelD\r\nvMDPmq8NUjx4xLgKvq9bRylZtLJAzHTUBD+5GqzpaESKhvjrG6pfSe3GTpaK\r\nJDDyNnz2zyO3SSGwc9c8SgbnUXpsmAFVN768SMLCmJXFgoSUFR7MHX/oFfU3\r\n1QxqbeX2N43k3PqywarNA0GZx5/DO7EXuNo=\r\n=ateQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-3548c99_1673543690582_0.4827951340057901"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-a1b76f5":{"name":"drizzle-orm-sqlite","version":"0.15.0-a1b76f5","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-a1b76f5","_integrity":"sha512-y5di4HFQ48kuG548qo80ftr3+iS9QJ1t27MQJ6ZjtjM/WJaSoiViXp5q4wtT2kUmjMmBzZfuC3qhx90/bJpz6Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-y5di4HFQ48kuG548qo80ftr3+iS9QJ1t27MQJ6ZjtjM/WJaSoiViXp5q4wtT2kUmjMmBzZfuC3qhx90/bJpz6Q==","shasum":"9b5cc1adff76d3372ed7af78ab0f2d4dac794972","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-a1b76f5.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC6rOQA44PPNKFrwXBqYZPxmeTLYdlOza4U4CkcU6wEqAiEA1Y9OXgdCYq31JJ3aSrL3gOauB4t627EUnjNuvFFDmBA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwTPQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwIA//QnY439EgPiUlv5BcE7qKsryo7KjF4i6di3Oo1Bg0warY6aCO\r\n7xqK4cQqd2JRzErdpFJGMDzP3Eps8Pij9Ly79HvQ+XOOcTQn0SIMOwXAN1fo\r\n6EpAouKGvE6zVLB/kLuNOatSZ+l30No+Asn5lQCiAOErHGcJNy6fdM5JtsGB\r\n5jldk5G0KsP8LuJr77xwWdVmYIf579yUAn79Tk2Eg5NTUYvG6vm9ny7BSmjX\r\ngG4Tqp5lZQ67J8IM+MPlCWiZmGGDkurjuin74ZyD1v5CffIRIVuQ63XoGtlj\r\nMRkTJJPrAZoLIAnaclhia1YDs0Pd+6gjL7Emn+EdDLCr5LLLLzYw0QtFydNj\r\nMlc+/jRKBKXAPyoAupdCuABWqEn3BzepZNsC66lIadUpME7h4d0x3Rc60vWs\r\nqxr9dSOxrf3orAMmMdnx5quhNOxkrxBaC22idJibzrkXRuqTEMOypt40BsJZ\r\niIksbn0obUdWJpqzRnlH70nHbqCfqJ4j4qtVqX9fpjD57Pt1P1bELV9nX/9B\r\nBrNhky1AKnBw12BlhDOuyizETZVqNsIQm0J5cQosiqHtgenB/Eo6xNxDlzxW\r\nvZOQu7MXXaDochVUm5wcWEGMR3XzdLFIVe2x86kWrofmAcL/NGCGUyrNHE3L\r\nAdkzoda2Z/adZkL/kcCEQoL/7FeSZUa3Sv4=\r\n=1MW6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-a1b76f5_1673606096196_0.0982588825113031"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-656bcc3":{"name":"drizzle-orm-sqlite","version":"0.15.0-656bcc3","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-656bcc3","_integrity":"sha512-cKoICZdrhJ7dK2nH7tJFtCMWLIKDmUngVPSIMGTAWyhbplwJgOvdlsHUlL9Y9/GunaVMXAstdK6zwYjgIEh0DA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cKoICZdrhJ7dK2nH7tJFtCMWLIKDmUngVPSIMGTAWyhbplwJgOvdlsHUlL9Y9/GunaVMXAstdK6zwYjgIEh0DA==","shasum":"0cb982463a51bb3277887d247437540bf8e8e659","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-656bcc3.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBCXoOsjqIpvS0oFRZtV1NeUrHG4XD9FMunRafejZJ4PAiB/cHW8rEE1O0HZX1UxGKZbIHcnp53ID1ATJ54b99l59w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwWmAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJ2A//eDe1tQcpA/QSkkzBoECumnF2ubS3kJPYRRv+Wwg2Jl/VXGtl\r\n+d20c9AC3/xXT9qQmAf+aO3Kqch9slMLE/RTSM7pBwMKwlcbeW0NEk87v1j5\r\n4j8NfFdP0JeplyI8vtMlaW7tJ3Go3SUEs497ochjmuzs4P4SUpzPtJuYM9aJ\r\n2M/dtGZ3m3RJ2byqqVtuXD+QkG6Vro3RNJyfeE3jBHess+vE4F4pmRR3Jh4X\r\nHuDQsiANYtdJxaxEqix71BJQcUYNI2cKpXvq3bgMN1B4lNRl9UOmtt2iVSPq\r\nil2wchgPmYNqP8BfRagFiNeZoFE8YWZxi7xEij27V1CW9OUu+n5fy2a1ewqJ\r\nCmYlIzEZNYa83FcgF7lDNEgUIKzx7lM91U+0dVPSa2LO03Zv9dDoGMBWbqjG\r\n1e3srGTOUuESb6TAH+NYPdEBd10oKgI7TLqhNk/3/+yKQmC85fcWStPlpfgC\r\ntj7df8ftB3foTe32EWGP0vqqNHawxd0P7fh8GPG6/SXM7Uw+Rysvj4ObpEJq\r\nc/eBm5BDIYypUKtgdWoFY4RueqLUNxC4fLyYglH6O3LOuZ/EmZWZlnN6asAI\r\nJ+N9M9t//YS1ELrx+4B3y7QrGmIIPUkXf/7KL/OGHxwnPVW56RW9jygheVQU\r\nxxGXLVWSDj+uNh/JwKCGifj9KJV+5SoWvd8=\r\n=oqEr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-656bcc3_1673619840608_0.1638815977607715"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-6879c1d":{"name":"drizzle-orm-sqlite","version":"0.15.0-6879c1d","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-6879c1d","_integrity":"sha512-zABZsgthzE54D70bhXaxLNx7MIqrMtRuehnpLP9ogZyfb6ifj7QN06yRL9NaBvUTjSiOILjiasJT03pxM9bFWA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-zABZsgthzE54D70bhXaxLNx7MIqrMtRuehnpLP9ogZyfb6ifj7QN06yRL9NaBvUTjSiOILjiasJT03pxM9bFWA==","shasum":"2d8e022b59d7a8f9846523510a0c83b44e9b09cd","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-6879c1d.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID2z+sGOxl+6Ifm4fzmnE1xrmLdhC4X+R8iR8WfK+m7sAiEAlDzkEEmfB//Jbv7TIkjyWTSmdWeNKsYznpEUORjzJpk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwonGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQCg/+Mx3UIRURRb592cAPJJ3s4mg1OZPTWFpPdWPhcpuaXO84DuLF\r\ntmMup5ufI/ECPKQD0TW0CPae78B11L0bgQaxY4Syai4BLSvdemGdLX8i5Z+F\r\nZC/XT4ZWh2sfS0NZ6+MWMrsPJYBqhnFZfxlajK6OiWg2A184/wbZgWSVfmEB\r\n1mk0nEcp0Z6kN4RINfkpKY+867jg55o7uJmoiAZ49g10ql/MJv05ugfVnsyl\r\nK+V0y8pfyA2mnqCQqss/QsdyjD3bd+DkUsOnzo0kMBQcCU9esPKHcdicYNZ9\r\nSWJ56IswHBuqef1eBFoIy8dWw/d8oVeX/U78lT+tX1g2SpmV9KaUJWkErnF2\r\nFWaVUEA8imUIyGhFzijGSQ7Om1LL/JjP/CaQOfBk06NssIS0OeWd7/naX99k\r\naNojmWCEM6tqSMEE5THZvlvAgbXm0D3elIo0MCXvLuWxFeS1YfXQClIozL6U\r\nNN2m7IBsSCHQbPD6Tbo6/gT0aU/9yHx88hTQbwujq/VBGGdEPJ41XG7odxSN\r\niBoCK9nu7Sdcs2IMaDa1eLdbzZfMvQwJ6/z2ZSY8UrY3mhQL9RAeUTuqZV+j\r\nXQOSxGmDnchUKnklwBN88uei9c1Ddus0fgkZVhzyjpNAy+bgwQs6/696CRzp\r\nqWNcgHGo8yytOrd/aybfNXxvnLUZ8/HyrqM=\r\n=jHrO\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-6879c1d_1673693638196_0.02983054395617124"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-1766537":{"name":"drizzle-orm-sqlite","version":"0.15.0-1766537","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-1766537","_integrity":"sha512-AK701TWVuBlos2XGSK0mGoZfyID0IcdNne+ntwBrfvutZ7bNEcC45MTsu2stNz+wqrzsUSF9JzocNQ99oE5VNQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-AK701TWVuBlos2XGSK0mGoZfyID0IcdNne+ntwBrfvutZ7bNEcC45MTsu2stNz+wqrzsUSF9JzocNQ99oE5VNQ==","shasum":"af31501b50fefbd376eb036234035c40c3bdd7db","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-1766537.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGPr7QkPvjsYkSDtn2Ge6uTezPsRCNJu+/oGzTV7p45WAiB/oK2LoXr0CfnnLXVBRDLILCmhXhGmjvMwlNsCGARCYA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpIVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/dw/+IwUO85wznkGJ3S+ZR/DmDnAQmEg/AEzkUXvFQgxvVFQWBOAp\r\n1s4pCEmV/72Z55k4ieAji10nTVbXP6BBc7dZThcCHBMkFfMaLcrsJViILlgF\r\nwTJfTxMKpDY6/Wayuird7trNXBEyp0dzLbtpDYim7vsbMhsJTgSf0QM1Xxdc\r\nw6VCFLPOQoHSw6EVgEswbiGRwnsQr2QlbhMy8ud12BMFVjqki2bULONXTafk\r\nTMNqUvLs0fnObpuf+KbhQn/eaRXfCb/BIGi2ztmc/pvkIWZ27F0O+PSXsszT\r\n4vZz0wkFTDYX+Mo9EW5OODwiJOlzg+bftshA4MFhtMVT9fOuVrEz0NnBap1W\r\nvjXabOb5Sq6JVNBGs97VVM1VcGTunWl5gfmEfG7BA74huyYa45DA6duqlJk0\r\n4UCP8tdeHaDke65n02KXVm3cNxeapAmsPv/e2/peNcNIRH63/VrTPlMHZyHe\r\nXFVGxuT1C00Ttpf2IUPN31LXHkEYKWili1uPC3qhsm3dGQLEM7L4reYji9lI\r\nfe8axwp5+zdxs767OKUo1jqFMq8Zjy2vxs9APu3bhfwmHX7JNgRCFX3gxmYV\r\nz+QhjrFlb8b5SeUplMwBSUf36+/de4XkPwYYEStD+7XjHKMXV2B3eB+WxS3p\r\nuyPWHI5I9FjiWR4CBcLgb4YJ3fc8rjiw1t0=\r\n=EwzK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-1766537_1673695765715_0.8430973212642987"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.0-2b4d90d":{"name":"drizzle-orm-sqlite","version":"0.15.0-2b4d90d","description":"Drizzle ORM package for SQLite database","main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/src","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths","test:types":"cd tests && tsc","pack":"cp README.md package.json dist/ && (cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta","build:int":"pnpm build && pnpm run pack"},"readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.0-2b4d90d","_integrity":"sha512-WdURLN/bS73cNERNPfxtd9QkzmM1rdQHU/rz1Z9290OHsDGV6aSgZpP89Ui462YrURceRQROUVPkIAMUAAOUvQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-WdURLN/bS73cNERNPfxtd9QkzmM1rdQHU/rz1Z9290OHsDGV6aSgZpP89Ui462YrURceRQROUVPkIAMUAAOUvQ==","shasum":"4e961e51b6e6b4cd67e05bfad5eee0a8ff1896b2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.0-2b4d90d.tgz","fileCount":120,"unpackedSize":192400,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB+w0Gt1HMXBJ3uEyIGAqHlgYkGpCxc4zdU+uiTdK2rBAiEAi6dMTMdKLmRow2qQL1B5lh1fazMvdTXBHF6CLkt0TvE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwpbJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjmA/9Es2h71B5M3ZT0QYQbJo+O566/5Fn+F1GxhOEVBGdkw+TaPgQ\r\nz8Ey0e6UJ8gFp+jVc9Ij0cFmc2ligthRIp8XdHtwy5lf53Fg2GMKQfxawoC/\r\n1E4XSR3VBSZppZW/xVemPcCW39a9ktovWt2RF/CM9MjNMX2drHu2U+38CZdh\r\nIy5jLXHMOantIWHCsh7MZRwF6Rh0d6CjazE/S9cX6Vn+4kdFT9VEYmz/9alO\r\nLeW17GQp1Gnjypf8TVH2r6GU2G/fl9Y4G5QyaySzF9UqzucnFimnzxTUYxbV\r\nzFxz6OUYzj329T4hVPB9YjqVquSy3Ji4S/PXqwP4FqMVefer82V2mrtJmVdh\r\n5gItpgfqkX3TyBkgxGXAgCGVXkXbHL82joDgj6tyN8CWNMSrfqvxIlHf227T\r\n4bZ1AhxQHUj9PNEcTAE6N6u+cUGXN5QB6lVj7Wbc1zWNe/FeXbQurgMTNImz\r\nqxj+OeHnr8WHt//mKxt9aR8+il83rwDGEX8qR/ytTmxlyhzILE9IZ/ElUUyf\r\nacw323PDgDvNt71dHlJMVbMehNaOyhGOH7XjobwQT5NUX+PTN1z60sWxIIWn\r\nAXbgUv/ecTIzdqPTXlc4LKUM19JLPFUI+8fvxF5GmwO6rul800lCVq/mhPfX\r\n9WQAMp9u7fFpcnvnEkAe+EhICATccabMelM=\r\n=YKd1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.0-2b4d90d_1673696969266_0.9136486661071681"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.2":{"name":"drizzle-orm-sqlite","version":"0.15.2","description":"Drizzle ORM package for SQLite database","repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"(cd dist && pnpm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","release":"pnpm build && pnpm run pack && pnpm run publish","release:beta":"pnpm build && pnpm run pack && pnpm run publish --tag beta"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.2","_integrity":"sha512-Qq9M41SXc7M8L0LISzzcX/exCgKByMbh7F0uplAEjdn6zn0HnvmmRnN36FWktmnds2dmyeowJSYXwUaynigCRw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Qq9M41SXc7M8L0LISzzcX/exCgKByMbh7F0uplAEjdn6zn0HnvmmRnN36FWktmnds2dmyeowJSYXwUaynigCRw==","shasum":"efb1aa48a4fab88d3c84fe18ad8c5a332c1f33a5","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.2.tgz","fileCount":159,"unpackedSize":244658,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGd0kmsyzIX5VtlDz4eK/dmbwGaLSgvtsy0pBvVi3XHTAiEAiiUH+Iou7cKe81mSKSW2RkW1Toil1nkvalsML91ZUMM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxVouACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpJ1Q//fXncmiYXCcGvPzv2h1V2hFCPCjaWA+PW2zV5L+9zBxPdCNx7\r\nho0SMJoP6OK+Yn9/EXQLuk4mLn56V1QOJH2nTamaFCKL7RDWsojSqq5foe1M\r\njCK6JcDdtJqfB2F0uI2fs1ACpc5/mDy6P26v2caststdpKFsgyDOGW6UVF85\r\nzbztEKeVf+BLR6rbyvWhXmp3iL0t5PJU7urEOUj/5qzYQCsjRrd/6WR/LMS+\r\ndAa53DwKyo0S2lHZ3QjcX12jrKWD1fn9cTZtvoiH8dlzPcl6Ad6XYE39FSB6\r\n4Jp4w8T6CV43WBhR1vY7/+qqRrUbmRSLXFd49WNJNpRKw0AXNfbxyUBWfRnb\r\nd3LYCPGFVJ6oVzA1sZZ5MD8HzD1E1ggq1PCM/78BVgaBL6XxPmNOMl3JIV24\r\nBJYGXtv0XdVPu/RNrly0d+IwqTLU6JoENzO+uDXDZ/9mXYK4qcsPHQXu3+JH\r\nMJ2JXGV/PaDuRrMNoO6hPYVQtFvbtrCkPXl5YPTXWWeC0BZJWcimkNk/P3Gd\r\nBe7by8Mp7guOPToZWmtaskIag4O2t1J/Jh0ZDPH3Pcu/Znojv1PfOJ+vzsf+\r\nboW/2DBy55sg/7hH47jHXq5dcCDclCCGzdNyJbTTqNUDAM0Cia7Q4xf/IRuR\r\nvcVqmWb1CBzhkoWCKFdsnXGl3Hg8X6Jxiuw=\r\n=Jpkg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.2_1673878062583_0.3885510856942842"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.2-52e75f5":{"name":"drizzle-orm-sqlite","version":"0.15.2-52e75f5","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.2-52e75f5","_integrity":"sha512-29jhLPW3qcxD+OQIEl0BDzMou64gE3JmnfR2T+IsaFmyBIJYhWxFN1WMMpRg9yNf+BiQDfV7wQVE7a9q5gUcqQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-29jhLPW3qcxD+OQIEl0BDzMou64gE3JmnfR2T+IsaFmyBIJYhWxFN1WMMpRg9yNf+BiQDfV7wQVE7a9q5gUcqQ==","shasum":"03c386ed04300beefe2b604975a6e57cfa91f4ad","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.2-52e75f5.tgz","fileCount":158,"unpackedSize":233136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQpk6iX6MnJc7T/mXC9ueJPeLvSfLx1mOFESKccz1uyAiBpsQBFIafrjEE71zZ0FRaUkZ2IQTeLAJ4HP8PmBceGhA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWHqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMTQ//Xrk1A00R1LK6F8hphdCFbAEyTGTcIepgFFbs7p/zS26X6mgB\r\nrrXY6iy36IKFoglMGnBEJtLj5PNuuFT36f6Gv5f90T13+OsnV0BJYLq6EoWi\r\nu36oq+wzo/c/jId++Dkk7DU1Seu+oApcTEmUTXopa2qlHU/rjdab3ydLm4cq\r\nLMZ80ebvPYdlGW38tzYmFyDdAlfRwF2xD1/mlyJQEu8Ev+NFaH/9DmEKXaKn\r\nfko9Kbs8HtDxNNIm5r+Fb2dG+4tMa6kBVpJkG4eSi7JW60gvfaVUumbRX0wx\r\n5+0f4ntQPg5qB7P1s/NYtbua7Gc3a29/4uxrYOgh72EaoORTcEN81HhRl2I3\r\niPa9VevwTVjdm92CPmSRURZ1OhZLB1hgSA6gUyWHIUC21cXO7p1geAMiDTAR\r\nr9eO2NWJAGkxtShzNB5fNzxd8PX7uRyG1VWFrls8JPhQI1MPcR05tPir2RCG\r\no22ilpbqm2im1SKz6dF43xgVwvQVNbNMtblvS+rnbLRSov9p3QdZ2sRKosJW\r\nYrv/MVGM/M1X92c16IeSovqCmQWb4OpXCAyx/pwhVGuZv2/7UvUBkmwTLreE\r\n8m4auYknYsp+8xv+cDwlf0X8ZdSwHkVbXzGmZOuL+ss8r9RmnM30G9hn3Mbr\r\no98cLxGBnUPXlSGOvKR8GR9GTWzPNJlBd4g=\r\n=18hJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.2-52e75f5_1673880042724_0.8360473512436211"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-c675dde":{"name":"drizzle-orm-sqlite","version":"0.15.3-c675dde","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-c675dde","_integrity":"sha512-3RuEjvqM8H/W2KYysBRYdEq4G0q0X10Si32+sMEVS6uWVc4xlrzds0s7Hli8sHaSCTwiVPrlGb6KgE0Vt69+gA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3RuEjvqM8H/W2KYysBRYdEq4G0q0X10Si32+sMEVS6uWVc4xlrzds0s7Hli8sHaSCTwiVPrlGb6KgE0Vt69+gA==","shasum":"749d553d0e0b20a8f3f923d5ca594a8d4b801f95","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-c675dde.tgz","fileCount":158,"unpackedSize":233136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdVhd6RIWOiIVjKU406ZWqi2LxEFRMt1a0JfqMNOeeuQIgKPVEn5oXOvyciwxwPsU+LMjOXvJgFfuo3xrkwAIu4KQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWWsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkPg//RkCVbf2o252XSfXwkGqqtPQ0JQgsLn4Qc5gJ2qT7bHIDJ2PJ\r\nBVwZiAaT+Bf6LrT+tFtrnBiRUK1qjEyRK396eKMlzHchuWovx4wB+mzkdMFS\r\n9sHcNhACyUqenpBkeCLDI62DtzNqFdtTVUa6KWrZftsF4blXwzZUHsN8pnO2\r\nthwqO9LcAFGTfjcuxRihTKiwPmQv/NEKWRVeBk0V3sbJfXNJHrsPMPk6k873\r\nyKSNuw6NjaFxSaGTm/odIu7/S6f0uhkxHJwr882LHCS8fpjfgktTgcQZcAuL\r\n/Tf3buY0kkofA+Pft5zEjea/5scAJN3Xfn5l/DAweI47woV4hPDE0Lm8qkmB\r\nWnlIdQhCJ92ZPHmOf7F++RRK8szF+ZcnIUwv02uq9auNOsOXCRq6i9rmNfQa\r\nNieppKQSj7m5ev8B+g575jGS/n0LfZbLF17GcmQ4/KsZMxlWGNfYpZloXsJi\r\ngnAL6QQh3mUocj5Zd3avKFylh6aLi0X0pe5Xwlbo1unlnfj579K2ReTd168N\r\nxkuZlqMgr6ZCfbUAcisv1iv+IqkhQ6CT3xCFbMbhDsyM0BI6x75ILIveWMjJ\r\nev4jdOpgK0VKk4lCeC+n80gRCvfwtYwIZT0Dp92qW7hpL1ho7FiKF01ERdzt\r\np8RKWiM1BiNCCtCY5irLDzrDiSYHklJlXls=\r\n=2Ayb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-c675dde_1673881004063_0.12170136758451977"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3":{"name":"drizzle-orm-sqlite","version":"0.15.3","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","_id":"drizzle-orm-sqlite@0.15.3","_integrity":"sha512-97thJDBaOm4PsLeJWHC5BTKnlU6BpsbifQBZ5OuZvjGzQcDxIXoY4b/mOyvpeQpEFvp+n4oU9a2o+8yvYjYwhg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-97thJDBaOm4PsLeJWHC5BTKnlU6BpsbifQBZ5OuZvjGzQcDxIXoY4b/mOyvpeQpEFvp+n4oU9a2o+8yvYjYwhg==","shasum":"5d4dcbea739ceba5f4e77119954819aa031b2503","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3.tgz","fileCount":158,"unpackedSize":233128,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMzhVQpg6E+h3beXzPz7XksMU1u72E61WqeyO7AOHb7AIhALRSNcdAq5IJmnI150TX030oiz+IIIAaaAt45CsSU+yz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxWbVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+aQ/7BpP33iseZMRLZcneEi5TxQEW+ggCeWhH/LHGIgyDHcv+cUSG\r\nzbq6NysLfHjwrxNHTefw10B0iOkp2lSpeK/TrOWfey14+KWnYbawAepsTTVC\r\nvacUyZ8XuW/ZfxAYSQjCij2ScxppixATp4e5ZTn6XQ7T5PrpNZR09Kypc5g7\r\nQiTNOlVvNKGKAHjsqoSYfrYvpKMTxeJT9zdocP88p/sDQIRcVCZ2SUQN7hXW\r\nLKtBT+2UtimOk+MdpUAqCnUECYcK2WEf8kO9/Kr7+eXiO+fGLZUMUGrG3FuO\r\nGr2AAwPAOtT1BwDY1MhIwZjzhlUWdZSErFuCFcIfiO5i4ZTn8dSAY1ZUZzYK\r\nFHXQ2O4sbj4BQPNnmhsyBbdNdbug9/pFFjcC92k+pTozvtTCJVCKiZxcoqqI\r\nnfcD19hMKV+VdAtdcF0CDT6/QJWlzXrX1MgWSCKYOo+dZSQ/lmAwkIMzzoWK\r\ndXbAJiSE4yBSoEjmWJWXrfWXffzzwCqdPkCqNcgUvR+wfXtV6JbmGrseboZw\r\nR7fu5ZiluEvpAsPAm5ax32tKp8RbQsXAcR6V+11e745wyLGIIo1rKWyIcktA\r\nvItFNnu9Nyy4QcnAa879KqBNJT9r7he+vERPlNSJQmp9ivOWb7oT17MFEaKH\r\n6Bmcw5jGrl0dsxTZdRn+FlH18CS6arJwvq8=\r\n=wQq0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3_1673881301195_0.22639475325212333"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-1e62a3e":{"name":"drizzle-orm-sqlite","version":"0.15.3-1e62a3e","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-1e62a3e","_integrity":"sha512-44ahLCnuAu/auAQJYqlQ9kwv6XUPOgPQr/XE9K/oLP8AzSpkxs2MXJyTYy6BspZ2kcCFV57FjO81fu/8l1FKrg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-44ahLCnuAu/auAQJYqlQ9kwv6XUPOgPQr/XE9K/oLP8AzSpkxs2MXJyTYy6BspZ2kcCFV57FjO81fu/8l1FKrg==","shasum":"c4c231c1d68ce6274cb8927447822e6dfdd43481","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-1e62a3e.tgz","fileCount":158,"unpackedSize":233136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGPxRRpcPjc+7X5/6OX3ecHOWUq/+nR+WdPZGMzLgdTSAiEA7/R0g0yg+5De1nbYNwOYHcf7ipq0zjEzZAGqsvS4kyU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxXZ3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0/Q/+LBL8aG5/6fqw5i80fM8tJAk7XMr7etksZELBfsK1WYtmxRhE\r\nPkJNEpGAf2Yn44G7ySJQWJwrA/SYa8ysLWEBfBLftIuD/+f0pa1lcbpwgr2N\r\nrnbcPqJSpGN6vVPT6KbARPv3gIkWkE9fOYEWkVf/xnXRiTywPyHetF7Aws0N\r\nYtzvGy3Md3iFKrofoFdD3IdCLvVRwXjXMQHWBdlM67+S1R6pr9FaQ6GugVxF\r\n0/chx2lbCUpfSZuoLiZkd2OSEaQZkH/xu2FhmcyFZQrEB03GePB7/Y50AKjs\r\nBeGyOfZdzhHXe9O6W4Vld+dJiv9PFuH07fWkeDEfP+uHZoDnWW4j6jp+Xec8\r\n9fFs6cNI9BeEtgRdh7vIMVANIRJUjNVAKhUFZov4i3Tjz5Xr7lQ2gEEYBNd6\r\n+Bgjn6ABGw8xthLFZWjapXsCE8TOkhezrU1eWYZ1lI3xorpIJuxtztrZrdAk\r\nGPhqrsdNRi8qHOqNiu5Op7NGLzrjLf2ilZPQ2kkndNxGDyT1/UEic92pcRxq\r\nQm7PZKtcEX8VZbr2WACb7K0km6W2zIox5Orcem/opRxMrwdY1PQa9uGF4P0N\r\n81puwZo471sBscQrQFdOOjd4yYzCSXob02hcLIDCYvpKUlavWOSZ6Rb8bRPU\r\nSJAo3OV2qW5aeY7PtbOtoTuHd1obrxNkLik=\r\n=uyyk\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-1e62a3e_1673885302869_0.8410285817972951"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-72fb2c0":{"name":"drizzle-orm-sqlite","version":"0.15.3-72fb2c0","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - !!see here!!.\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-72fb2c0","_integrity":"sha512-leLoYIs+rFLQE2JvHmgaGj5gIN/T3UgD51L0bzBPlVueG4Tg4XwDk0ENvwZ/tHh5AFY/vp6zrTk8NNAQyxuzJA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-leLoYIs+rFLQE2JvHmgaGj5gIN/T3UgD51L0bzBPlVueG4Tg4XwDk0ENvwZ/tHh5AFY/vp6zrTk8NNAQyxuzJA==","shasum":"ac446a5c29f991a55b94c5bb53c193d8c093cd49","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-72fb2c0.tgz","fileCount":158,"unpackedSize":233136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMXseeyQ3xD7ks3A462/cAAJUyzS6o98pWVasqyXepNQIhANzxfNCpYn/tmTeeKqm5X6qhp6IUZgbW114xGrXUa25R"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxX6qACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrCCg//SERdn1dX6wQQ590+uqrn6g2Xcm1Ej+hY6NFBG4coEov13IOb\r\noMtd78LQGMa6SeELTGj+UtUfXs0EEsC7z3YmLVqPjD2+0/qVktkKLqTQWRew\r\nOSWNawi/xxNJJeN9/3+Xyc15Dh2SHF7MhztEmIWtVtZsw9ecCgO1p2EzB0q+\r\nAihPBfTO8UjAjok54DCu8x8VhGCWXByuZCdjjiqJbC/M4nYlvds0AVljQVZt\r\nlF2QPIfET+YOq02TwQ/Kbia/lXtVsbjNrpKZPa4iF59o4LcujMceA5QLrcqW\r\nDqOdhrX+skfhNuP8b9a6LyQIp8lPO4aTL4ry7GMrqbrS+moNBOXvowjf8LgO\r\nw7cWE+WlTDjUUzI7+2aHwOOzUBkQemqluOpMkzZRLARsp/8D0P28c+pFX084\r\nDZVvImPQpYvYgRTtVQ7OYK4cMOh6zHWYACpCO0FyWYQBlKjXiqhQcuWUCI77\r\np+Gy+RBmK30nf4X/ObF0N9zlgMDnCg0GNs9JXXNlaYxFixtNGGGb+UfG79nP\r\nHFe/PWDFy7XryWzjEbWJEauw7fGi61FBNoJ30q2Oeup/s/GSZevOfxhinQgM\r\nysYnBdSAfk9KA4JXq9wijEGeWO7OJs8QPTWhTuJWhEgUs1QM4CSwl2cReFkz\r\nSfPhpwG48QtVE8OLyV63BDeWiVtOzeje3X0=\r\n=oY3E\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-72fb2c0_1673887401950_0.9771027053846633"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-23baedd":{"name":"drizzle-orm-sqlite","version":"0.15.3-23baedd","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-23baedd","_integrity":"sha512-QMnvhtfwtBF46yN8LthRiDoL7Lls3Y8dL5WgSxz6jc6No/79SdDrfP43naOhRAw3t3pQw7cEVsay7VWnKrtJqA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-QMnvhtfwtBF46yN8LthRiDoL7Lls3Y8dL5WgSxz6jc6No/79SdDrfP43naOhRAw3t3pQw7cEVsay7VWnKrtJqA==","shasum":"22eee9c752d622cfa3311a43ad8bf17c1c7d0e8a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-23baedd.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCk1STbTjV86gT2UHds3SNzLSX10ZP/0o1HJHBdte+jPAIhAMOkKtZj+H7k6vvthszYG+C8N6e7VMfYoPPtl2Q2giiF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZHhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrGRA//dP1+lxR8Jt771VGoYLZin/XZkh6LCNaV+D6SGbe94xWLqjap\r\nrlyO+lii/9oe6YNr8jQr1MJXXoyD+dJMUjaexZt9MJLN7gePGHJ9tukewmGb\r\nN6v2FsyP/KQHmuhdJuFfgCPuqQCHIQkNr1FVb489g/lU44/WH01K1AshONwi\r\nwXDoNr+8YHOScnUBLqldU2awt6/BoN1dHfI/nkWtJBraWpp8K66AWVrWOyzf\r\nyjE3D5Wye/zceKZO+ZNgOVGbwNh4jYXNZG7s8VrKSFgDhzfD1QWf8dqN6B9K\r\nGxIN6EdxBD4iyqHaWCmMuGQWZ8EuHO7I6bIkti0bQ0bX5whNHl5ELRUY4F56\r\nTVS/ngg4f7qn/qbzL7wXEm2fg9BMT35SyHGB1l+qYRKeiq5NU4721qjbCWIp\r\nHLgipLh9ch+TuVksI0NjRgMsPM+gtcovyi2eSUS1rZ8OaSoqzYcNR7u/8G6u\r\ndIunxujiUiXK44JbexfZAGe437ZAVtT7FvQiXf26a/sHUiWn7hxjBFwqm3xA\r\n89HULap9GhMTyV3c/D3AexCKC+TOwV0Fx4nAa/Qo8bMFXvEbcYsfEfDXn5VT\r\nMu7lnHCm637EwxG44ZdDnN8uFrPzkSKdwzGVtK9r2veDy+Ok+hThfTIPN9FP\r\n/DiRExWWOeg7rg11Y6/0cp32ex1NnASkS5o=\r\n=Vck7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-23baedd_1673892321464_0.5208170487034429"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-844cb31":{"name":"drizzle-orm-sqlite","version":"0.15.3-844cb31","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-844cb31","_integrity":"sha512-UXJlrYcM4P2iYAfJCxQp7ac9oX2/N8Rn9f0oZLt4elDSKGYOSVIx2t07LCsqr4EL7bQzLZarN4pziRqlg7hCXQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-UXJlrYcM4P2iYAfJCxQp7ac9oX2/N8Rn9f0oZLt4elDSKGYOSVIx2t07LCsqr4EL7bQzLZarN4pziRqlg7hCXQ==","shasum":"3304d8625a2c596073203b3a7042c7c188eb8ad8","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-844cb31.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAxQh1y7DEEbJzU1tkBDg/JOny3BdxR1aqToQJ2+e64eAiAwEru+Da2bMm8BgmTzucoKekPSZ+9lhpOpaIQcz5DRvA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxZv7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoEJw//aCV+td018W8IUcX3vhn9lvTihdEH0vOqM/ek+wF+7Jn7ZNck\r\nhI9SsCAAYaIZt0jqJRg7cNqEzyXsk6iTarD7wMAxEXjkN6kFuZvuOa1qNWOb\r\nokDYlSqn5qNA3zSgrHkTqPTmo7K8m776SiViqlhP9RCLXtf6RHzA0ni0ZMQB\r\n8/BWst59kBPpoMW8yMyqjjSgoEQaHvOvEKmQ0qVJ07cYxYYEMyT76Y1Ic/tW\r\nukRZfax3C23Hji+bAnW1Z/aNZLxyaZO4WojiXaTBQr5StGGqioUktRQ75mBy\r\nFJGYxeMfvC3eh9KiRzqCCw5jtlmxSrsiq4ygVS99mYW0njWFHC+pFLa3tnNQ\r\n2a9/xmlaVXbGMhOTuQ18eae5smM5pm0AfO9B7Ei7UQttFCUu2b8Km+oJ4B30\r\nMCHHXk0ioMg1RrYDIo7CdE2juByaf6eRe3jiReCZ+4L12jioyKUxtOe2c0CE\r\nVtWyF/gfIgBi0FhQgPnwzHREkUKOmNGPMIDbO2f8B8N1wOQijTfdYkWBMZJL\r\na3KfbCkbOQdu10MnIMuyUferxO5ELLFjEVBMHXIB3YY3YEjplxF2NCyJrZ9J\r\n44mUKTg9hZm8c+9j+3sBznhlNTxW8z9b+FfzE4syyBIJrPvRjpekt+Uk6Dbx\r\n9VpiuIgCBNMBEpCL3UB+WpV7J7/0jNveOBM=\r\n=DKfG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-844cb31_1673894906819_0.3361241301211382"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-98b2097":{"name":"drizzle-orm-sqlite","version":"0.15.3-98b2097","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-98b2097","_integrity":"sha512-zTQpcyyNmuNu3fVxQ9lBohu0o1n7B1PXGDD0ArSzjfO/j0Noc73ffvxnrCoPX/URlMHNgAcqyeaIs6cogCZJSQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-zTQpcyyNmuNu3fVxQ9lBohu0o1n7B1PXGDD0ArSzjfO/j0Noc73ffvxnrCoPX/URlMHNgAcqyeaIs6cogCZJSQ==","shasum":"14d76141fe53d0a2e4f95920ca8f20df6dfdb420","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-98b2097.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCH1vnqQ3aaP7iwPJ4StawiKS+sIJUUjqw6DiHeQ1GYxkCIBXCb9w0bjqTVye/E4l3zCWyUjj2nONktV53+W13rg2m"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxazrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpnEw//UjayuOIkoj+0RLQgr8s0wUmx+RHOtzwDAvD5fRA7OsWj2Heu\r\nwpJv3NP2qXTu4fwVgSF0PO6jphvaaO3s0NN4KF3RhKx8Jdn6vDobeji/NFSb\r\n4pFxd+FV1zJHx5bmXOkznT/sSeNDDoQ7EbSfUEO4MGM4gHAp9YIQopGq6+7I\r\nB6LFHfnh4qCy9TwtKqqg1rUdjVmdiZ+FN9mkQR1us/fX9cZfBqmuPSXbJoz4\r\nGs+RE3Hoj6KttTPZhhzXliNv7L4NPbMRRJ7KXjpV+6chLeh1X0zYmOnBPw6m\r\nwQH/NQ+Frm7xwOkoairyiT2hgV/XRnsB42w5rnDufc1rODMpqaygdkrBZH7d\r\nR9TmfbVzo9VjRrFHg/FJEg4nGn4y6JZCeaDinadSmvXd7WP6v1hL31CiPL7k\r\neASbDVX9ITdXA4iaf88aLrZsjzbk8phruHzuZuMIPUOS4JZFaFo9liuipG2f\r\ner+Sfdki/n9wX0oGQfjbeEc7E43eCmJy3gtkwsr2osc1DNk0Pw4kwTfa8Von\r\nK4CKAn4MLckYLszIWiXVPJtQle3zQvonccZTQf5i6cCptfx8mJ2nxhRsN44t\r\na470PZ28xSuOnt+Eq0IqDLlFoIkTF8AJmF1h4W6Uy0v2Tn0W96SP3w0OT3Xh\r\nsnMCr+78JhCXaTOn365PD2YyxxSmOY2Y1nE=\r\n=LP0Z\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-98b2097_1673899243441_0.8389580755083446"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-0dcbb16":{"name":"drizzle-orm-sqlite","version":"0.15.3-0dcbb16","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-0dcbb16","_integrity":"sha512-TfflcMsCl5JMRzMAxeTh0yM4MG9sstNhirgPnChNPelA4468J5qYxsOOH5GUKBQ3FP0Ap5fnTWAS3YdwzQWe8Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-TfflcMsCl5JMRzMAxeTh0yM4MG9sstNhirgPnChNPelA4468J5qYxsOOH5GUKBQ3FP0Ap5fnTWAS3YdwzQWe8Q==","shasum":"a5f350f1649684e9bed0cdb804edbffc6fc12c4d","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-0dcbb16.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH1n4pOdQfOq4TuCwwwIBH/XZm0jgkqMmtI8ENxo1an4AiBmjum5FPgP4EMHgaMs9zoLDxpA1XKPV/1UfthWatUWjw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxa0oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9sRAAitWTGcV3Xl/AqNKWHbuDfhqzDA1t/etBeDY5jlYwMvBLtqAp\r\nI7wBHUDefnF9U2V167/Fph1TJh62c6izDVUC4f2Jk39IDtF6r/zPGH5EkqYa\r\nYLd+2FM726TnpRzGwZQ1J14ZzlgTU3fyQE4HkLjFgX/WkNXwjqW4lOflz4JF\r\nSfoyHl7l4hZwocYmv4nhGGrSWG5hQO4fxlaFMrZWxJp2EagwXwSdBIFU9oo4\r\n8mEnrrY1RhUp7x6xgAc5X4Vqz7g4KJThE2ie2BH8k8lnrAC2oeQ3CzcfpMtL\r\n48uAsokHBvzLJTrBOBdVCXKEs+N7+hGJO6HipC3ivNljDUBay4ONGc5UP99s\r\nd5v5E+1w3T2gmUg04HSJey1JYGL7dGIiVMyd6IfgRYWtSVu4vCCCwozUyPdK\r\ndrPKOSJB7OWXA41aTe/kgvgBGSwIbcMmLqn/FN4/wa19FtN8AWqxelpM3Chz\r\nFd0P1eppdAKDgcs+IY1hu/by8+iGJJKr0AvFTydGCLzWwwRv/LKyUV+dxjix\r\n07OT5LFH/MmqCWQe1JDT+y2My72rhDziWBsI0993d/9lJ4Hbe1vaPw4epmfM\r\ntmy/yVsslEjhzUWbVO8CzUIQ1klrGKH95qm62nQFXZAbCTxzP5Su5M5a9XKn\r\nyMYFPwB474Eqlryxg+pRhampxV+OjfCJVRY=\r\n=HgfS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-0dcbb16_1673899303773_0.22685832463919153"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-335d188":{"name":"drizzle-orm-sqlite","version":"0.15.3-335d188","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-335d188","_integrity":"sha512-tu+/eMCM6+Y+yFIyAoQ+mgGvWn0F0F2T5Uny/X5SDqdzDZ0zfRKCxN1bFxAdoN7eMAHg9dSbRedBHLySLaStMQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tu+/eMCM6+Y+yFIyAoQ+mgGvWn0F0F2T5Uny/X5SDqdzDZ0zfRKCxN1bFxAdoN7eMAHg9dSbRedBHLySLaStMQ==","shasum":"b6297f22b2d1a6028bacdc47f7ee607e494c1ae8","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-335d188.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5pdnETHBQJUW721z3Rij2ZjWO/q1LOn2I3jTtUDsyOAIhAPOmFXwKumNFz6NubZmq2WVcVl4fM75iAAFSpZ+x7x5y"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxvhCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmps7Q/8C4xCzo5uQAuXeOXl+ZhOawY8i72XBA2TPam4W7Gnh1H7lgDS\r\noMDu1cLBL8VX0lvpKNQvv4LcNcbdJqqSFySydGOy96yiG52FODiZ79LZVeUM\r\nViLvWDQ25CbhLwMTYubm6hxrKifLwVF91g2Mx+87zaBAZe7IC8m27aVPaytn\r\nl4ZLzrdnFhqVDvBV1PM7ccBKMlg8HL0CPr3WelqXsCy77W38qOMVcNyDfLHO\r\nFgG81C/2tab9yZi3P6yiESWICWtIcTXbfA1c6gJ3tu7YPs0WabbNzrXzxlEq\r\nZZwkKDcxUW/QV+x1ouuF85dHZQFy6p7kc5+MhlToJJaOId06RorEEl+6rdOm\r\nuox7Sk30xSTdXYOMER2rhSvit+gxlJjZXGlK5OiRzhqC7/BLqzi2VYEOoCw/\r\nlupZbdrJhSe7wobCAPK/PZRi0s87wxBBfwbUs03zRfvCOe8ek2kom2xsL0ac\r\nhvD0POs+qVYHJk+r3xuaV8at39csy/yPOFu4iVi1GT6sGvmOihiDyPXd3h1l\r\nUuBJ7qtriKudF2UpECZVd6b+U3v4QTUR8sgFotrePqCUuYfW/CnNgDC1R/E7\r\nVrG50Wk3zIeeN3DUZ33H+wT4cV2K+HOoB+GBqZvgWEZWjwbHrw/JZxz4VWdY\r\n0qSPufG0jOW/h56L2R4tzLaQAEw1ByqxlKc=\r\n=FLVz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-335d188_1673984066440_0.0828151076919803"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-b422bc1":{"name":"drizzle-orm-sqlite","version":"0.15.4-b422bc1","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-b422bc1","_integrity":"sha512-AMAqzIMzbKHnvrfzfo/9fdFKWBTkZuMGKRvl5K4T6QM54lERRLgl6Btrz0ZQi/UHcJyW3wH+EyOVR8R/VxuZlw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-AMAqzIMzbKHnvrfzfo/9fdFKWBTkZuMGKRvl5K4T6QM54lERRLgl6Btrz0ZQi/UHcJyW3wH+EyOVR8R/VxuZlw==","shasum":"2abf62148da27d62131b84d532cdd51d6039c252","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-b422bc1.tgz","fileCount":174,"unpackedSize":249326,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBYUy/yghWqk/JQtRh9rhHWD6/PIM7DDrgsKr1DZHHoaAiEAxUVr6nJmsq0f+ab+q+M9dvHR5uEeZ4YmbcYaiueUzts="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBWhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorTRAAn0AvpL+RiXBCGpfwnEyLzt0/qr8hZSUl9shM1qwY3ZJ80H4J\r\nqnlkxwQKziSDGou1YVyS/Yiux1+TZyZT51wxquIqArsEemY/MXphTkc+rqa4\r\npkW2xC3rDfc433XC5nXdy81u7XKyRrqygVS7gdpBs4dsEDs5PwA6Llmen7TT\r\nnXm2f/xlvzwodEbNaaCyEotk5URAsYHZTHiiApmH/VqPTTNctFh8hwSrpRfX\r\nYzd+aNqbglfo1FqkZNa5tyo1GaJL0NOR/CBHI5tvyTtsD+pmvsnCY+mcR/Op\r\n2Eel7fohAB7qDGqw/gpw1yZ6J7htbVLog+tbmSoPBqpFaXMMUacL8U7SjacI\r\nhIWD70XvVVr8xnNa3OVjCQFbDyydirqRijetvfSctRaiT7GQ62mkstuyZqA5\r\nHbC9G/vKVxLm25PjGziNf1yw2KSqxax32kJ7Vyk0DrN8bmR6tizafk0eWPI1\r\nh43ci4L+VzFDOHaIiFGIbs0oWtSbebyepGx3z9m40tOCWAUreGEb0FAbo69H\r\njMxSemt4d6mAff4kXdYu5topv90YLTDHi7M5AfDtdeQkexP2OVtnSJyk+J3M\r\nbOAM4612Zm//56ww/4GmbZa4dblYDyneVnCxtiWdmCePe50YS9GQSwg3/KGW\r\nvbCCCdHCwlkrhP+Akbui+RaEjMy3evO9HFI=\r\n=wp/n\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-b422bc1_1674057121567_0.9253450090417743"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-b3dd40c":{"name":"drizzle-orm-sqlite","version":"0.15.4-b3dd40c","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-b3dd40c","_integrity":"sha512-6Izr0UCg+u1omH4j9uv6ijTImEQ4BOeB78j5qVr6JpFfKVOaBwLWBdTvPp1xMShTOzmhg8BznsF1iBEjL8ER3A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-6Izr0UCg+u1omH4j9uv6ijTImEQ4BOeB78j5qVr6JpFfKVOaBwLWBdTvPp1xMShTOzmhg8BznsF1iBEjL8ER3A==","shasum":"d9be7366bde388930f398335acaa2c2fd379a635","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-b3dd40c.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqLeaOCQnnD2aeMdsv6zCvEIsexuWnB7Wwh12gRe6CkQIgeKONPbj2lljbNG/czf6pTErIgdw/OcCcIIBD3i9+ZOE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBh7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoioQ/+OUBkk7w7PFTKzT7QdSgk8Oszn2uPjfWLIdMBsRpaMQ+E4Yu8\r\nlgxBVOz9s6Bceo/F1KK9QiiI5tDr/NhGGEZKli0TjEnDv4d3KRHrNBXm4b35\r\nmtg3T+8ItYV5Euv5zktNtTTSQkL1RMEJVmFKl0u5In1IiFZSG4zsX7jVHnea\r\noIXqcrPnASo8SkN3GIOgSuaStA4/6xVhLir/HCkilxs37biCLdrlVIcKsUC2\r\nR0MNPJYYKZVaMVBOFD+rNdor82N/ngjjLjlVCAaa57wToeexHQhJSuQH3uak\r\n9aLCjnV6kIXxrTgVHNczOw3s2NfiXnxJ8P0TSMErIi7IQHl+LF90PYvfSAG/\r\nSJ1xmOuAgfERtHhNTb1dcsdc5n81vqsSp2nmnQwUn14YD0LT3w/z7lWMMbku\r\na9YfJjYxKTNPoUTBsefQfAHh110fkFra7DZZqS6fsSn9BFj2/vP0MmUThsHp\r\nc9YKjg7YXooR6YpLhtKApJVXXtZGTp7TyAEkQ25Q8fP0bi0Qj9+BPfIbIG/p\r\nVH7iGqYe5PpGsf4poj4oqYKOWVl5HHHaDVkBCbeWEUe4frjIdJx2s7Ha7d3c\r\nQyxDKj4yFjCFQcUk7b+t0rxn7QjP6yHRL3daxLlmEiB+XHcS0O0jYnzHDkGU\r\nMagXUG+VSJCQgxpsxfjpPTSTsT5BSaBRqok=\r\n=F4It\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-b3dd40c_1674057851512_0.1624058711800842"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4":{"name":"drizzle-orm-sqlite","version":"0.15.4","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4","_integrity":"sha512-EVD+ykq5RV77Al6brEig8MQRY8gnwryoS4cUHqek3RfmzH/6GV9D14L5ttpMTcUY2e5DLnHTmNePckssb/W+dA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-EVD+ykq5RV77Al6brEig8MQRY8gnwryoS4cUHqek3RfmzH/6GV9D14L5ttpMTcUY2e5DLnHTmNePckssb/W+dA==","shasum":"7e5acea37f60ef26db5f1d6fba2b51c0c76db330","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4.tgz","fileCount":174,"unpackedSize":249879,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIGQ+ZE3l95AcGgqtxDp+bEwQx3a08CEJUwFKFTpHl5AIgC7m6mIYAUbjjbYWzG1bRHhxGkNkJw3OGqONr7+I3lVM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBrLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqYg/7B4TJ7wTnz9CL0p1gwiEBpXNaxekH5M+ezjK/7/yhAm6Ycuh0\r\nvhBan/4RYPKszK6Z45HHBFO7vd9ynNlnym/2E3VsvjqVtxQJ1Rv1kSG2f6kO\r\n3POeN3jWOnWfq1JvhGZ0Okfb3IVLTqMlvcemZUcIwS7xy3gOFLnVFuMc0xdk\r\n1IsEAkCGdiHiT4SK8+SnkKHLHzE6NOBlodwLqnVczldk1prcOwsAF1FtJqa7\r\n56j/FUo7caf3XU+wwDeNsHwE7z4JQU4Mne4jT1EIblKRZCYULzCQNHzJt8MY\r\nzmb1m8enJwtu3lttjT+6HWG7u4/sDJIZtiG0LULUA1najYQH4CPfExWHTMeb\r\nzBVCLUSIwW5++BeRe4HLJb3fPYpsNR/8r7aEdXu5CV+b8f/bWmt1c/v+Xvzd\r\ntEzgn0B3JGFovYTuWbjWolyTe0TkwJPgPAQc3GzwBAgGEyyJwBiLJSfetIv1\r\nVdWl4H2BenVuRlyhLv6fGkxOZKjb/EgBajCy6jcDkn8qHKcYROYqcBUe+hxn\r\nJqMQh5j2VC/8EJoxAg12eaIjJW0Brvo/mg8uOijbLN7f3wr1t+G3ZHBQP7Jn\r\naFoFFQMocz8OiRb77ndOsSxbb9ionBBIBDoe0a5wngokhk2ymh192b0v83gW\r\nu1NAzlB8zY8dGmfyDn5xIIpYfx1RNxO4z7A=\r\n=cpRe\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4_1674058443086_0.8993549933689504"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-71be15e":{"name":"drizzle-orm-sqlite","version":"0.15.4-71be15e","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-71be15e","_integrity":"sha512-MwRA+42IwnIXAMt/L7Hh8RnzGHiyv4wpt/Z5TWUEkDF+h4Vh7hqujWRz9KLsHnlj2WwAehlbjoDaimFiJFXVKA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-MwRA+42IwnIXAMt/L7Hh8RnzGHiyv4wpt/Z5TWUEkDF+h4Vh7hqujWRz9KLsHnlj2WwAehlbjoDaimFiJFXVKA==","shasum":"18cf279893b886ef23c76cc160b909a3fe1e3a76","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-71be15e.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIACk+e/Q/mTqRUL3R6pbHmUwsEpxH+scPVYsWNR2mSiVAiEAy9sYvKZ+8NHlpYIrROUschlgVKp1pD8AWYCXBCQY4Bo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBw2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq4EA/9FLMEdtyIOYzaSkm4LCvobt4P4dcq2nCDAAtzqE1c94bkS9Pa\r\nUfHZwJPfu4NjuJXT+Q9qAQFzyk7Zj8RN4TKkQPbp8dfDxQwEq+rE1v4QT/qo\r\nb4qPwmHcHNlDD5lw4u5v+pBYJOpPwN6cb619b8fCCTc5f6Gd9x31MOUVD37F\r\n90gZN0KL6vHkl3s1Xy6qMayy/GJpBpsWepucVlpSbadFXBeJ2qj3IPZ7Risj\r\nBYdPZWeBkk+ASHhr8Lk30yGSAE3toIIVPTW/q96IDImh76ExpNomhpQ26t+E\r\nYk4Hvr7wPkBKjC1Z5c57wCpqJrdbgRZaGNmLhnRdumb8XOUK0RB2Sj4Ti3WJ\r\n+sm1Gjsy6N3n1fLCAddXtF5UOiRFFiky41jcxdxtc9tSOLu6nvw4tG2jYk/L\r\nnidU0gFEMN7fKfdWs6514zOpMYR6fTAUxO4oGHuU24mIsdoTieTfa3Lv0EzO\r\n3jRXWpJM2mfZx+WhFPldeurLAZuYtubJwVK4TZTzIm6GCRJWRJNJ4bpFBtUG\r\nUhMWJOPb5A5iln3qSMOsPCtmFBJ4NhLRH4HmRuTRSLjIEcPO5r9p9G6bWzWB\r\ngMMRoEmbsrKEkZVHNMr5io3JZbbd1Nj6PtTTKiazfwefoMluPK6zXRdhN3we\r\nE/wjr4iUaH6NdqUytxM1tu0EyyradLbWOoI=\r\n=ul+i\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-71be15e_1674058806455_0.4267978355569493"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-30915c1":{"name":"drizzle-orm-sqlite","version":"0.15.4-30915c1","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-30915c1","_integrity":"sha512-937apbs4OidwRnqF9gzxv3c4NonPWELRCVc1uXmR+lkM1yoxW/1KOvVUqSFIFToFxJ5NaTXwK8FQJ997JVwu6w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-937apbs4OidwRnqF9gzxv3c4NonPWELRCVc1uXmR+lkM1yoxW/1KOvVUqSFIFToFxJ5NaTXwK8FQJ997JVwu6w==","shasum":"caa39fb736a7260979b7f931155abf66cc9331e1","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-30915c1.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwV6i35rZ9yjrVRWiD7K9fxQuR5V4OcLjxuZkAkIRJ+AIhAMLiw7eX8ZJXyDIUoaprpU7HTPHpr+gO0T/FHh2RrnQt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyBxoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrZ0BAAhRW0SFNvWRwi+k2Y1vEDvdp0HOaHgODrAQHuRhoA8kELARJv\r\nIaEvqcgOviBpm3eL5y2hz7VbzEnAe0MfwxETAESMapa7W/Ww+ipxU+0o6nLb\r\nx2L+EHpVjuE5bTHBiRNQb6Z36fKHtxOxisEpwZGDlxStXECB6y04cTBWY4H/\r\naGcIUahJhW2NJMRK+9XlT3+g9swOqxE5aMSToBw7oF66odKjuyChXDclh60L\r\npcFPznbsF3jSYfVcaLb0PzYS2gz++O3IUAHxcZvzxyIOLdlfB7Janrl33hD3\r\npPnKhbIowvKQHA4eAlXY9hZs7zy/vtavA+PNhUCbGlRNZ/L16OXjnUpNWDjA\r\nXHsdpujJFx7Z/d73aycLnS4km/Hca7EZnoWFzw8K7Lw5IGIdyCq0StWCXTGX\r\nnDCuqhsudLgeVeDpXh+beq7HpsxdSjRpZDzsjES/xnvNbZaXnwQ/OdiA25tm\r\neWw18Y2jKGczwBIeaHZhLl6mNvA3MHNZ05kEv4+mYNsFgmZelQjOiAy9uomP\r\nxIuTsdwgTCoLYsY2/If0b0HzNYAc0hUkihR5m0XvXpvfuAOxoEA1qV7mSa6B\r\n9H+GjTpV65J6MrfpaxFEY69gWl/nxC+o9sJPDup67LODnfvhTCIdriN5y1Wq\r\nQ928UIakUnML8s6tQ/acp7fdZ1wPA8OZwog=\r\n=skst\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-30915c1_1674058856641_0.40458974025476"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-36368e7":{"name":"drizzle-orm-sqlite","version":"0.15.4-36368e7","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-36368e7","_integrity":"sha512-tmq+8xOUYiJUdGS7Vz36K8t/0H17uA+AmMJZ/0rEMH9WHxJK/Cu4QH+RWyB2GZMmiGIQ79XlvrwdeQhBP8bqDA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-tmq+8xOUYiJUdGS7Vz36K8t/0H17uA+AmMJZ/0rEMH9WHxJK/Cu4QH+RWyB2GZMmiGIQ79XlvrwdeQhBP8bqDA==","shasum":"f18a993b8f9fe7e4eb53ffdeb913f5fb97d49906","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-36368e7.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8WhP5G8gQhs3fTAwB9pJB4woBZFteqbY2IzbDU6L87wIhAOmXuJYISXprtg7AU+e7bqem6UYRIZNVeZnDH0WjWKqQ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyPwOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqXAhAAmhvX2axy4kcwjp/gMlMtnFOVMchfgfzRzOpOEwIHi0n0J2qu\r\ny2/97jk/GFNe9VnI6W9tliz8x2q8WQkGYjROkFYjFHHyrSWbPVQ+g7WidmmP\r\nG9pB+shLggiVMdc+HBJLRiJRHqrPghhINCZw7uIFX2XgaSqrAblYGg9m/+Gy\r\nWI9GiHXNWbzOGdLDijxmXoP6c9WDrXZiJSZnPJPqAksg+v+JvaNZLlTLFzlF\r\n7GRX0Cw79Cmz9ADX1YXlw+68o+6FN0RZJfro0vyEfTCC3Tvpif0h0YGH806D\r\nF6ZNBODq/J0WpcyeE5W3ygy1veuUL610EzaUZTA+sOEsFEeL5cYsrDK1UKbW\r\naoMEoRF3uCOKHnqUbtRDtwCiIgvTUDTUHHysA4K2gU+haOeiVY+GbrIhA6WR\r\nnlfg0DGp+ckQ4oJjDCkEV7SCQTyaEHVKXxROmrU/0ZfwAV9zFbA5Qn01H83D\r\net2TKsAfDJSDGntRWxwCn87RRQypLsIUoKWGwG3aBfOnING7p7xl67Z4d63M\r\nUTrOuh0dOB+pKo12fa1gpsmwORrnwBWGC6oVJ5CwX6WcktQy6M1thG/t/+pb\r\n0TTdJggUFvfN3I8OjiW3ySpImpGZxXpcfU56JUWFOqU0oBl5lWmkOaeFrxEx\r\n2aXs2Zp1w/E9/43VP3LpTGjJ4Q49I/P7Vfk=\r\n=NXMK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-36368e7_1674116110385_0.5150372494476996"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-adba448":{"name":"drizzle-orm-sqlite","version":"0.15.3-adba448","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-adba448","_integrity":"sha512-6s1zPwrMEAUUUITO3j07jlywJpXkUIxNIlBCI9mzrziBHtV9zUhqeTPej0wEu3zRPHU9KE7NpVBx+dT4xpBz3Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-6s1zPwrMEAUUUITO3j07jlywJpXkUIxNIlBCI9mzrziBHtV9zUhqeTPej0wEu3zRPHU9KE7NpVBx+dT4xpBz3Q==","shasum":"5703f6f5e83f5195c8a840a8f2669adb59272d82","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-adba448.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICZaSAXsBCCNPKbrejU7o+vlWxt52aTmEjUyyC+I7dwOAiAHN4iNWvSCdrzT3VtSXTUvjouX9NB3XysdQbU+XimWlQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyQnrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBng/+NldEe98mbPJBJ9hTE1fg5jz+zrgZLLmFyYzCyTm6Q/9J6t2O\r\nL/USeig2Zqmk++V/2E5TeBAoR9aicimy3s7nh6XgiPn2ndaAioCBMcMAiaa7\r\nJ7fhrf+xBL/2Sag2gcSAnugLUxRKYv4sGo3sWUhzLcTaIYO/6AxQ4SwFa0eB\r\nqzfqNcTGQj8zUmTGZv/mU6aCTRGR7P7Bxa9FkbgIH+3L6w51ApFS3TDFHDPV\r\naOgFxOmZfIVPDOS0TnuFRrJ+e12SZKAgG8sE9f/9IdSfLagNLlYAtbCHyRPs\r\nAOOvzJ1d1GCQ2RTT31x+6DlCV1HzRuPfEBzGpm4eje5th2hGrsj96wt1rvpD\r\nE5toekmeEsJ34kT+07lQzE6SLAjrPIPkbpJ8YtaiF4hsiufxuJTuTCG1WtB+\r\nGzR1VfYoZH9Y7bsT6T/3xg8qD1sCZ0P5u+OSwaexfb9L3+wJRuZCItRbG+v2\r\na6efzqVdKVpXwUCkzkpCVFe+Nlw31Qz96eWouTOKhtuQDyIyGkJ1GOCLZf45\r\njZ14IddbwXsHipbGLzM6U30/PlpmK7anYtq3M02RSn+I05da/HyfEJyWDKZA\r\ng7yjnCYBqxBcTSKOEuCHOBHNumehBgtPUOMcMogZJN6ewabUiTcatnSTfTgn\r\nYNF0FOnYo9NX2WCNdRKtVteEl3r5HgA4rNA=\r\n=o0P8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-adba448_1674119659556_0.7665462795866667"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-bbe577c":{"name":"drizzle-orm-sqlite","version":"0.15.3-bbe577c","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-bbe577c","_integrity":"sha512-j5nLL8UEjI13zccYXC/yj9N1DR3yBmoOdm0xtStsBcFanTxB5Qrp2HFuJl9kBSDxZeHUIdvfS+yIUefI0RWIcw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-j5nLL8UEjI13zccYXC/yj9N1DR3yBmoOdm0xtStsBcFanTxB5Qrp2HFuJl9kBSDxZeHUIdvfS+yIUefI0RWIcw==","shasum":"834092f28a3a6197f40436d67fdbfc3726e3947e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-bbe577c.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+bqYFIbj780GRO111CNwLUL8KIVQjtuJsgCdetva1SgIge1Rfw9WcsBQd+vDdH1q4+S/VC+WUVMUpCF4HgJUez0A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyRekACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqG0Q//RlOspNyKC1rwJ/6drq0QudqohYxBpHAxwLkIKifHiHIzIRwG\r\nag708jjTWc086KrkxrUyfiWr6AN4ZmVtW3zg2mrt86d0vF+vRTGbWDP8Xw30\r\nyvutP8M04QmbgaJPlaWuYAVcFshmT5m3Fp2oochNladQqsgMATYyklSNbo0B\r\n9U8XtQonsMR9EEID4BeSAy9GyLTIEiSFr5sShkbYMiCnsRr5LKJCNkIfDBjI\r\ng/UTfI8wZXI2+wS+qngVq7x/PqgNwt56UT9g6mYBEUbaiOCO/WPU9BF6A72q\r\nJBTgk4L0fHF0nGNSjcOb8zNyicEJfNsoTb3IQtE3l1fXnz0FzR/kPy9GcVJk\r\numvBY0295LzhV+AJVQ4cDRC3zD2q0kUIfCFAr1hP/3i7m8BR0phIDVnF82kj\r\nGORjySqMZpqQClBRm/0OdF2WXVfnuMxwuBijs5P+kVDcyWpSJEOtpUggPfCr\r\n1HRhy4V9CMD1PzGB4USdZcMRONJ/h1AQ3UJDwl5ES/uNoBDxm9FhRsJEa91Z\r\n9GH4z+PviWhQpZ+OKVEgIB0kLkw7S2EVtY+799u9+HIC9Xb0et7PIRAmc3pX\r\nYx3MYjI9c5xU+yYJOzpGcN4y5MyYwqD4fC6u+ypxgSWM3WLOIRGqWMv3RoR9\r\n9gltuVuyWifUeCpRz7vayXXXw9PqXEkZql8=\r\n=vIBM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-bbe577c_1674123171814_0.037342378025128964"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.3-1c43305":{"name":"drizzle-orm-sqlite","version":"0.15.3-1c43305","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@types/better-sqlite3":">=7 <9","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","@cloudflare/workers-types":">=3"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.3-1c43305","_integrity":"sha512-wrRMeY+7dVRiZ5LlZZFFX4KaIgHzvabAKMMPMX8RwMOQzXekHwQgXnGQGs1wWII9EreIQpkpXTUoCms8PRceRQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-wrRMeY+7dVRiZ5LlZZFFX4KaIgHzvabAKMMPMX8RwMOQzXekHwQgXnGQGs1wWII9EreIQpkpXTUoCms8PRceRQ==","shasum":"5e03dd2a5c25844c139ff4e51b5eae9f0e3bf05a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.3-1c43305.tgz","fileCount":158,"unpackedSize":233211,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID8fOcAQkUrU+78Nwufpu7MnuGhjYy02uhpVgF1uhV7AAiEA1AR17anyi2HJpvAb/99qgqmHDudg4eMNvvMEBlQoxvY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySJWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq0sw/8DyB0OberiKRwDpgTbBuIcBs1ZZIkIE+fpdtr/J6RowPQWxqW\r\n4G01GGuZSXCOlxyonVgHQ5ml5Y7XWtcWj5fH5u3RpCw1q4sQCMHro31w420H\r\nULmV3WzkPx/ZFf+MUDYhl8LfYiWfaE1TIDjS5M9WUbMCryqH8QjhQuai1qLH\r\ny0CwpiaAz4czbJKQMDrBuFQkr0epixcZeLagT9C1YTKeFmK+NHJOkLET/P1Q\r\nHMSWwLh5q+Ds6psNCw/ouZ4QMULWqLEj0WijQfLmelKDSP7u1+c6y6J690Zz\r\nURGXqfjqHDu6Vyh8BfVNlHdeu2jgS9TD7tB+Ee8dKjAgo8GR2WcrVdN8UmrY\r\noSK4p9vHtB1nwQow/088hKLH1iity2/Wq7GnWTDsw5w53DiNxhrcjaCn+uEa\r\nRl0cBMjt52B+Hq7IiPm0GHefJVGb99LEaLfzisxE9EjbCAf4cSR6ufiw2IKT\r\ncHVYsUtsJZcIx9tnQZjLm4sQaYeqSYYWOqod8b7BrgvDgG4LWpt1o8vLfb4y\r\nmXeTYa8QJRCxCckCeBmeOjIdcYGPmOyWnsl70wOH0EKbiTBw9Qgy4TwEaPoB\r\ngWxi6FNqCfedxL+dRTCF231jWPSiqZlkhrt27a+nI8CFTpQWpQHYPRHbKQBb\r\nKRD1N4yIuGy0efL5ESl6gk8xszHSY3ok7Mc=\r\n=cwqt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.3-1c43305_1674125910544_0.7771293767610499"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-f77c6c2":{"name":"drizzle-orm-sqlite","version":"0.15.4-f77c6c2","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-f77c6c2","_integrity":"sha512-Bc9F0uwMgCSubZt+uToRbNIW1bjmOhZz4dwCRPFWadkCBrs+kKFXAPkHZn/dGGj7PQkBt2e9PGSTeDN1IGW8gQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Bc9F0uwMgCSubZt+uToRbNIW1bjmOhZz4dwCRPFWadkCBrs+kKFXAPkHZn/dGGj7PQkBt2e9PGSTeDN1IGW8gQ==","shasum":"8b021a233ee111923d26492a3683af07dc089b66","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-f77c6c2.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/Yy1ZRGOSIg7MTfFR+eYseZwxvm9ba86Q0depDyb9aQIhAKXAnXJGMrUzMA4LFhFdCzhvgnUk8eKcFG2K+TwXsVME"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySMpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4MxAAkoQabjA+aczyBaLMjxRz+V2tMSHTx19gtBGDtj/Pz6pMadbH\r\namqrHQqVI0qXB1aA1M33phkNGNo2LoKdHgnEPJKMyvNEHdibbv7M1T1UCf3Y\r\nfLVCx/hINLD5hL7rh8iurF0vaK8BzWpEFeLtVuyxMezC/3CudG/6crJsWOZT\r\nUlKATHY7VarFGiQU2f5IYSPudUbQdoqLezfi9x25e+/14jNtWVc7VquCumiJ\r\nNFKs/8cw1jGhUv1ajZPfladPMEwdf4O3qguX0cDxR1DerBfyIzOOGna2gCAW\r\nIxCgX+ssyq/s+v/F2tfWvybyEb5kCIQbvM/r3Up8vrNDZNqO7Af4Sis8n0nJ\r\ne22sidHmhxWkSLVSbNp409NJfscjlmhOREvCIiwO4hPb3dNTmd05rzLrfH6k\r\n7JgO9+d5O4s72eSiAXrX+kC2jUvKvsypBJ/U1EmvhOJw8IC2fc0wfVLAD6D1\r\nA1tTEj7LVfuji0tDhHOh7cSBAsaVsxQHLW16FFTDSBKSiT6ex9zz8aHlrO2E\r\nKcd1+I1nzunLOcfuZaKQzOFads8o1vAxfzNl7Mo0cGtVle1URSYPXQzSCrP8\r\n8as5BsigFGQ8GxeU76+uhI+0NUcNUdS6GMDKH2sGksS29CDZHl7C4E8/wMsJ\r\n4OA62M2+GFmr7aGsfE4p9q+WzoFdC9/yzLI=\r\n=do9y\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-f77c6c2_1674126121512_0.3136964461533174"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-1f6c448":{"name":"drizzle-orm-sqlite","version":"0.15.4-1f6c448","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-1f6c448","_integrity":"sha512-Pi3Sftf9oOIyZUjIBD9sp/DiRbt8zeU7oC6IakLnn6lgf6oRlWuWOsnq1hybFw2d7/GCB6r0jWYDufXuBkvBSw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Pi3Sftf9oOIyZUjIBD9sp/DiRbt8zeU7oC6IakLnn6lgf6oRlWuWOsnq1hybFw2d7/GCB6r0jWYDufXuBkvBSw==","shasum":"96f9d1b05d2bb43294c8671aba35adb509d6ced2","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-1f6c448.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAac0BW/wf6ivK/nl5eZvgKpXzSw/Rd6NwXVQyjv1NL1AiEArPqUqUAS9IkuNvZyte9i7ZrdQXljKDPlv+afaaZI+m4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySO9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqsJw/+JfrY5BBScjKAUV7qoLgQ0wfYREg1qHoMKcykwoqpFWkheR0d\r\nObvO6tR0KlY2gCwWGGE28oeyFRjvV2ZJMmFYWPjyRt4GlEYGq9DZb5Pcdxno\r\nOhW7QA/ruEtNozfELJzPGyvaD+tmFRhYOTth+jtzN9TEjnwFxOuL6rq7Fb4I\r\nrI8ODcatNxDe2ZXubZ95QfO0zzfPe7iF9JIoBoSv9gsxuXnpiDbre7li54rN\r\nRGRR4cTEAhGU5PWuqmCWHbxeBUBajY5P1PpPqQD1bn+QBKg7l7EkJiKgzmhT\r\n/0YoJPV1pSUZhgqsT+044EjxRO9VGSrRhqd/8oj0aBnn0OuNVmxONOO+08op\r\nFSnWX0ENmFLIOfFqsh7B70MkFTR2gO+z0cNo30s+wxQOyYNhtJi6iwoxa0MS\r\nbdOPW3hskgzGdMl/w0mlo4BkutyrUYLl+XvOv3q1x1RpCOpcpEa6O0KWxR6P\r\nBKKz/Iv/d1dFbKTBs/TUbSScdJSKc8NYZHPgxsBLXGjKCB77+S/HcVNdMmVt\r\nH7rMO5HgLTw5OxGHJMU5DDasSwGLJn7kmHhY1QAZWcjpKb1spgJe+o+8XIy0\r\nYl9CGWCiSy9oZ/LcX+1WAXtoKJK+Ro8EmGsdZ0t1g2Ek6+m1+BvXQopJg+bq\r\nqdIKhJQzGK1Gr9xzv0GwsMVPeLzOpPmdI2c=\r\n=BuZi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-1f6c448_1674126269500_0.8022755913213053"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.15.4-d8f67aa":{"name":"drizzle-orm-sqlite","version":"0.15.4-d8f67aa","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"# Drizzle ORM | SQLite\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#migrations) CLI companion for automatic SQL migrations generation. \nHere you can find extensive docs for SQLite module.\n\n| Driver         | Support |            |\n|:--             |  :---:  | :--        |\n| better-sqlite3 | ✅      |            |\n| sql.js         | ✅      |            |\n| node-sqlite    | ⏳      |            |            \n| bun:sqlite     | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)|  \n| Cloudflare D1  | ✅      |[example project](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)|\n| Fly.io LiteFS  | ✅      |            |\n\n## 💾 Installation\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n```\n📦project\n ├ 📂src\n │ ├ 📂data\n │ │ └ 📜schema.ts\n │ └ ...\n ├ ...\n └ 📜package.json\n \n## or multiple schema files\n├ 📂data\n  ├ 📜users.ts\n  ├ 📜countries.ts\n  ├ 📜cities.ts\n  ├ 📜products.ts\n  ├ 📜clients.ts\n  ├ 📜enums.ts\n  └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#migrations).\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (table) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(table.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (table) => ({\n    nameIdx: index(\"name_idx\").on(table.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(table.name, table.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(table.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (table) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [table.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [table.countryId, table.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n\tid: integer('id'),\n\tname: text('name').notNull(),\n\temail: text('email').notNull(),\n}, (table) => ({\n  // composite primary key on multiple columns\n\tcompositePk: primaryKey(table.id, table.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.name).where(sql``)\n```\n\n### Create Read Update Delete\nQuerying, sorting and filtering. We also support partial select.\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n\t\ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\nThey work just like they do in SQL, but you have them fully type safe\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n\n### Joins\nLast but not least. Probably the most powerful feature in the library🚀\n### Many-to-one\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\nJoin Cities with Users getting only needed fields form request\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n### Automatic SQL migrations generation with drizzle-kit\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (table)=>({\n  nameIdx: index(\"name_idx\", table.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\nIt will generate:\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"phone\" TEXT,\n\t\"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n\t\"id\" INTEGER PRIMARY KEY,\n\t\"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n### Printing SQL query\n```typescript\nconst query = db.select(users)\n\t\t.fields({ id: users.id, name: users.name })\n\t\t.groupBy(users.id)\n\t\t.toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n``` \n\n### Raw query usage\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.15.4-d8f67aa","_integrity":"sha512-cOBMcosrrekqCsjhbzP9LxSITHdS2FI8Gf8ed5w4Uy/uwKxZRrCnm3Ib07nD73ffFTyYg3dHvXwuUG+4NUJMVg==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-cOBMcosrrekqCsjhbzP9LxSITHdS2FI8Gf8ed5w4Uy/uwKxZRrCnm3Ib07nD73ffFTyYg3dHvXwuUG+4NUJMVg==","shasum":"02c381ce854de4077f864e9c8a598820738c8986","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.15.4-d8f67aa.tgz","fileCount":174,"unpackedSize":249887,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1ErvIPcGCw7HcSsFv/EVsfw1FnXimWSMf/OAUEuuytAIgAQmf31B7WT/A1cHqauXkTTskoJG/ydmvc+2CU6FB9Fg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjySS1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqGxQ//biFG1+IrjkgWMfq8yOzG12dTIk8h+ovkfZb4CZeNV9B+lQsd\r\ngfAxtjGnGY3+eJ1w6xlWYTI4erbBvPAkb39bJAu60fNtBEEstlCpSQFlf7vX\r\nXfpu2WPYXC1PMFJJ7XV79oifidzOEkrMOdMwuKlkGM1BmU8eCqumt3RCMMoM\r\nwOTIrZBOXx2VmVc6xZMfln7DgGYIe5HTa4MiPS8AUd9yVttNkoXxjZwbqdBv\r\nIevoXgUc06Lsy2ySrmYbAZTUoRZG1z4I8MnbiMg1ZLGh/RdSc8seo47eT9ZW\r\nuCmSz6bFNLonEZSfNRGMPj+6GLo4e82J/x/vGuVzM9gFfmpSo+C44AuZZN63\r\nrOC81nkv5I5Y8gQL/U9nuH16MIS+I2HF0YMywzb0olVys8M4TouCinjrBdoJ\r\nWFG2JTxWCm+TnwJ1zpijAXO2uK1574oe9t7OF4yHTnfOZCtwrcqzrI0lfUDK\r\n2f5XalQ8vKfZZPg1gkmK0QB8cWSvjMsYViwn43wLP4pqLFpDoje4Tl5+9yUP\r\nnk2fHb3KQF4uVmtIJr92wMd9OD7NrFjen16DIARXQQWzVu7LZfAxcv+TsSIM\r\nSXIY3MQVJlE+x+q9kQGmfkTBlDrBRY5Xbf3xkedLPPTTsohMaQHIPuSMOsOc\r\nq1HVxhPFoYfehp8bH0/h6Tk8MDBZjtfd89A=\r\n=dArf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.15.4-d8f67aa_1674126516747_0.9964031226464416"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-11f7ff3":{"name":"drizzle-orm-sqlite","version":"0.16.0-11f7ff3","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-11f7ff3","_integrity":"sha512-3DdnQWUhk+k+MT4gN+ir3ufew+YGcp9m2XJCGnUzaOfv0/AAdFt27mlsr59BPM+TOEo5ev/MBN9J0BFvOT8A7Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3DdnQWUhk+k+MT4gN+ir3ufew+YGcp9m2XJCGnUzaOfv0/AAdFt27mlsr59BPM+TOEo5ev/MBN9J0BFvOT8A7Q==","shasum":"1d4ffdca4a6d79ba122dab035595f73aeaaa361e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-11f7ff3.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3geFZqWoyLOHXYEFvrJEuq1w8NzOiubesdAPrB4c3oAIhAIi67wrQSDGHkGOky3u09TAjRKN6oIde7CY/qt1QSMjz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyXCFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+9Q/9GRvdqpcOVwvNxVw3mzTpUiQEWkZ654GYfe2+LJ4zAWdWkxcM\r\nW9pF0AJnnohsmCmeM1fUK4e+HmdLUGLf79bBCCERfkHc0+RvcTkwtUO0JN/0\r\nBzX206Xkobwok/M7+1kDE3/yFzNGs3wIMDlPG3WDxrxQtSRQEPkcpH43q4Y9\r\nKXbIORRMF3nSDIPhQ11YvFqDqg7HMgMVVWqiH4kojTm3st04jQKnK/ur8y3F\r\nL3VIquROZxJs8FtfhdkKK42N13JoRHwt+qoGKWWaH2SF27LT7doNKziXLCMh\r\nE4Yx3kyMMUpxTGn3srL+GfHfMQW/uuT+0u+0+U6l2RbLTmLH0DkmbHyEKiNh\r\nnsbo0iKuhgsvEmHg3Xx868tYiEbKzcfz8o8eheJCpE4v9Gdth7cE4BHDbR4h\r\n7GxS5zqV4HwTL11fItjobwj8dX+BHxxGjNxI0keZa3/dt2YkQtAZqGFlG8xI\r\nreOLxnSkyBpHX8sXp/MkNpsnMIJKChFV9sj+j7rZRPfSRSAQ7xmMF5aGR1ay\r\nJhV6Gfl7IUg+DhYeFv8zhjo2KUS1KrHSAGotpyyGv0T2R2fT73hJbbvin8M3\r\nU9Qmv1RDvhfiaZXBiet/15qmF7b3QnN+3MyrB8wbmyqbbRl/7ftx6H5SZSfV\r\nQNKZvcDaxDuEfX7Z1zQfgCddOLXCZpf7HjM=\r\n=DayN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-11f7ff3_1674145925490_0.7710107928318086"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-3e17d6e":{"name":"drizzle-orm-sqlite","version":"0.16.0-3e17d6e","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-3e17d6e","_integrity":"sha512-GHzRr/hTMG1WfTBtnkfEUr0loMnOx/QhG4bDK7gj5A3aY752NMbmF+mWCGSXZNaMnd8C5hnw2sdEz9GGfmuToQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-GHzRr/hTMG1WfTBtnkfEUr0loMnOx/QhG4bDK7gj5A3aY752NMbmF+mWCGSXZNaMnd8C5hnw2sdEz9GGfmuToQ==","shasum":"5c6950dfc05f967264bd0cf10243ed443eeb7d5e","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-3e17d6e.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDUYzCfoc4fqvnxO5APmEyhPJBHXkGxYTklKD1ht4vywAiBWViSi0nPnDsuPrsOJij8J8ngdNwHBIHhJFgQu1M4fFQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZ0RACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCZw//YR7lMlC7/9HbgAWuZhuJLdDryMmW+CY2YCMXy4HCeSXXYld5\r\n1pcXnt/z3bsyTo/Nrrnb5jSKjT0ljQUg/Yt0E1Bnz2cRwrMEYq0hQSqqAvL/\r\nd3UF1tRUVA1Xx03ZW082GPuotXpW/B5f5UdZ6EFEt5WUxmxDsO5DVpAToW3L\r\n4YwXmbO2c/4xHV5EMsjncf0tt0JLLPwwc1Vhnd7f3SC/dUhSMdWpYIYt6jQ+\r\nZ6+XXnbl9AizFVXpYFYuHQkFExsJDyGIzq0jqgTAYl2InS6QWTz4fbxBl6Hf\r\nxizYjyyOmSPnKzaErVr5wavww3hMwOrYfKEZE1XTbqE0Tc8dcGhg31ya7SYT\r\nhYUKUoxbBMhMfVu6TBx+V5rITuorIHniZfzbXCfCm1WxHzPRCyv8wfrVtx38\r\n0U96+1thjJPBmYDWXazTAvLXh8JxLMgX8sweLpXYn6fiXxMfBCJYIIF1t7jf\r\nw6DvVcKwhhfjy3f6TIII6fkitsQevz1tmaB03jyQCKWg6hwpWQaT0JOrYvaL\r\ndnJkeAr0wDm99AzkGQxlbS+QtEmg9l/FmZDMZoUpRqWDUFGAlgCSGbLcG3zI\r\n28B9ZJyaPqYwqXatDT5qaUt5XDLsBeOQeC8Hn6edscTVOgG5kR76RgrTYcpG\r\n2HTVNEyHFXhSPC7RCZzeUxfr66N5HiAqMZc=\r\n=8DMR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-3e17d6e_1674157328806_0.6977892397131946"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0":{"name":"drizzle-orm-sqlite","version":"0.16.0","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","_id":"drizzle-orm-sqlite@0.16.0","_integrity":"sha512-C2Prsw1V5/VZkauK6pPnfyfulxpKwyKpzu/OY6oWeq64kCB+DrOBqacJEwk1cMsi1mpW3sMaFyUMSXcFEG2EVw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-C2Prsw1V5/VZkauK6pPnfyfulxpKwyKpzu/OY6oWeq64kCB+DrOBqacJEwk1cMsi1mpW3sMaFyUMSXcFEG2EVw==","shasum":"cb59c3be05f05dfe190d5d8ef02880000858d5c4","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0.tgz","fileCount":174,"unpackedSize":251038,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbF9bxizdlE0p9C2bA1sqruT/RPRf7T7oUB89iLDZmEwIhALlZZEk80vFdj69xwvIgLWYW7C2uEhnr1ftVAxxnOEqQ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyZ81ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMWQ//bHN8d6GTfjjAls3ygdOz4f802qne3IUQbPcpq+XZZJ8F4lvO\r\nliBtl3+eExa4CquokPbQ8c92pW4OHR+oGeV9SLwUKEqMx6+qX2iZoqElGgAa\r\nvivMj/PLzq+r1+elVttEqwa2A6iME2zRwBURxvfog2AV42jX0URykcQok3/E\r\n4mYWHJMXxHm4l2gUH652S5Mz5lYtcqGYNJwL4OzmdPzlsz7Bi85wsXBLmJ0k\r\n5HlKTR68+4ZWUF1K40HrsAgc2M6Pd0OuGN12Zz/uSic1YhFwmN63k0vVt8GX\r\n9i3lEgQLsKks4lmdumkC3Xy6rmgKOVkoNf3uh7rASokUma/VT5VzpsW4qIwE\r\nQrHIdQmMl2dJV6VVc7tLXDtF0v+2lo/yT1ut+TchJgkNI16hIbHSyBWrsxi5\r\n4vo6NvhRqPhKe2b8B4o21VRyGYlQwuSjLq64fYSQ7hCqEnlmxb+hIyM8XlIR\r\nGCxArBTz8yhrcnT+NJ82k6YiVTqpDttwj7rxO+qpc+sojYmurRUeDLSHVkbh\r\np4gkZpy4IXYIqCrOm14k649dyWmpVByAdiRPItPF4UyPwtKrmLZYBnbcNn78\r\n69LuANcnPhZXgKxu2wt1AINeqRYEG2N017EY49M2Or2TcSSbiUG9pQSXYJpD\r\nXVMzSE4npj7kR1RMXDdFMgFrCHCgDfG0qgk=\r\n=AaAc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0_1674157876949_0.6214346034900384"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-56d16f9":{"name":"drizzle-orm-sqlite","version":"0.16.0-56d16f9","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-56d16f9","_integrity":"sha512-vXgZFunfNXEuC4b0eLBnfIhbfKjjH/Smw7Z1SbXC7a3coO5dLyDgV4985RTOnHi3SDFQIIqxktR/nG4t+4+vWQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-vXgZFunfNXEuC4b0eLBnfIhbfKjjH/Smw7Z1SbXC7a3coO5dLyDgV4985RTOnHi3SDFQIIqxktR/nG4t+4+vWQ==","shasum":"38a4053fb72c507e5ca424d7a93ae4bdce7b4e7d","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-56d16f9.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDr9eGZfNTc+jMBYeela0tZfI+3YNp8paUJB6BluGikcAIgdaZVftPMmoINgqTDOIZ0bDln81TRJPOYpMu6CaX8J0Y="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyaikACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6Ow/9GrFA4Q1dg3kpweE+z9T5O934bFLJrieQiUwyHuRKc29XBgac\r\n+EDfKKS10279AKJZLjQ6a2CD/UK3GOf83LJNfEWqsRewa8c+/yVgZIhL8fpa\r\n5Xku4S7TMxOwdhxvpEBLVUQPVYw9RbShHLLcBXOWcDCwTn/L6hMqJ4oSUvPQ\r\nYFu/QQMp1B7mJ3mehG0mwkmnqA/5OMBs6Pz7PJo8Df3zPCnr0GOeJKv9D+rJ\r\n00W7XafAI9aljgdIGjPvquN0wYwwD1qdSfK0e3LFYBnkh4xi//udm/BKSGlA\r\nLM3lWvXao5jErynRPoVOIqSzs3aq3pnQTJqi4kfVVWgqr8dkCWd9BCvjE40s\r\nOaTMLTAw0cSeLK8XVe80dSZSaCf/Mk+kIattiUgswhh7vcBRGbjJtvqFlq/E\r\nY+k0xL1AFFwThWatCLLUCF2FPbWfqJ+6cduVDecCKEvBuM4ww4q05DmELgUm\r\nMQSMwCAljQWmFhBHHMppo6FHru3Lj0LhAvD7rQ9wjEucLmZmMgYDaeTVoWcQ\r\n7biWVLCIS3tF2WzQ7NxdZmrJapuDDK/21Rmmr6QEuUJDe6WX9Gbx8H3z1JLV\r\n/4pYzhLbwehUl27JXyJwGiO/aGEQrD/ASs1aup6a6qIL7BjJBBD3Az6Ixinu\r\nC10uC8okXd+C4KhdoMgX+7utAYJ59XOMYB4=\r\n=/Y2v\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-56d16f9_1674160291947_0.7563670490513137"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-b4b5a09":{"name":"drizzle-orm-sqlite","version":"0.16.0-b4b5a09","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-b4b5a09","_integrity":"sha512-Q5ZVU5RhoHBLiLygRyJVI2wtxmO/pqxM2LQQKZc8HrFo36JQR9KJUhJmtbKNJtIWN3h2K61BXv+a222mL9TjKw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Q5ZVU5RhoHBLiLygRyJVI2wtxmO/pqxM2LQQKZc8HrFo36JQR9KJUhJmtbKNJtIWN3h2K61BXv+a222mL9TjKw==","shasum":"f1600bcbd81756318fd1ce8528602dcd00530b1f","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-b4b5a09.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICeYb3Gc5WGU+uBPMzWqWbSF/wNqrWXItQneoXcN+Qf3AiBpBAWCsbeEh2e2uTAEw9u0Qvn44pfgx5flj/nZQyfBLw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyaq3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrSOg/7BIgZUmdKQLk+P/htbd759ROfw+zh/LOWEZ2stHXElrKdccdC\r\nseKsu9wpi/GXYHsqqiKEUBPm4MH+Ph+ie9p1Vy8+yJaI7vtmbSKC4XazWK6T\r\nsPlX0XEIE5lsBajhSaxbaRnz6QaEBLzFxcZLH2VGDDvpdoouWyHw96CVHXZS\r\noHpTnvPAfjI0CQq/8Q42rIjEwWq230M9x78ZEi9fkBjNsr7tSJYtBgfgCEl9\r\n8K/3HCyUyDxTr7H9hu5YL8Qe7Mg2k/9k2Jnjdx7KMIC8alorivEIaFUDkxAQ\r\nWCVBrubxb5PAG+MwSXCyOp5jSF0u1KTxfyO9j+RF/kXMY3T63s+TSRhEP+Pf\r\neG71YEu6fjj7eu4LKLlPgzoIXMTFL3KYe8ZkbDMFzjsIQDVb3WVFEWt3qAY/\r\np+ImefrAd7/2Wii1e6fSlvlYGdZw+DN/Wgl4XjRcjnd2+5D09SlZ+7wrSyzw\r\n3Dik5A96WDAB9B2TCqRKpmb6vyXM4LemYG+QV/bo4KjW8wK0eyRV8yd2KpWb\r\n+n6IwZlU+o29DDiJvU8Yvek1BktPimBFGfiq36kPRBAyi/WZLz0raFHTmbD7\r\nSC1AN1WgwGmV4Roxs6lvuS773adhNlFmx1/oEicGNlrObGh55DK9LN1Tl6AX\r\nk0hWredNR1rDEuxzpm5x2ZN9MMDKpdRcu6k=\r\n=Xuwu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-b4b5a09_1674160823000_0.6867108943694042"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-ddf4681":{"name":"drizzle-orm-sqlite","version":"0.16.0-ddf4681","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-ddf4681","_integrity":"sha512-fCod56C2t40EN21G3BnLqa1+I/BdGznxgFCb8sh539A5UInWEJZ/EyKL/Csb7Q2HSaWgSaAWhftLZIwGNetawQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-fCod56C2t40EN21G3BnLqa1+I/BdGznxgFCb8sh539A5UInWEJZ/EyKL/Csb7Q2HSaWgSaAWhftLZIwGNetawQ==","shasum":"5ef0493fb4d72fdfdaa70f31c44721e0a8a70a4a","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-ddf4681.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCidAgzHuSRMBMaCHGSoaWwBIbDBdy8u82NePFU3tSbsAIhAMtXgkA2OemubrGmLaF3/BNP3+pXEa3tmc8+oIquNdmC"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjya0SACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrnWxAAoHBxHHHiCAuAKPGMzg2wsSlbyTu9cFdHyFjq0UWGQblnFnAE\r\nv5vNAg3t2yVlIOBcja07RtY+HbaYKiTIEk6FlCC5TlMkvYMxLQ5hfOwdD9mS\r\nCeMeq5jhsu85er5IsqM/azfuDshqsLk+8YFFUwsf4MGCWeXYWzl2AdM1Xt73\r\nbB29ZPltLXnOQRmjueZloyGA9+cS51WkVU4RDM5HrBWZujZWOtOvkPpnHXY5\r\n5/OOiv2MgEZumS3Bln35N5Ng2epZ7jCCOb2MJ8A6L3BKp8DLerppgjGhLqc3\r\n2rNFYeMQgK26b7Ew7SwDILuoXegMxDYZzWJehoVugZhSQlCzD1zrcgd4H+G6\r\nHrlqmpyjRfGPVU/DDQaBUzs4voXgdYubIymXYaSpoklDrYkOsngOO67YCn2d\r\nyaVu6TUtUstVPTaqkIlfPmhKtVF2SZIPrQL8SfDjYNnFreFaIMr8I4Zr2pxv\r\nDjQjGNsOr0Txgg1XEmnw/RKBWpO4x+Vv8dnd2bvV5vZ1eoLVFILv+B5xXl8G\r\n3d88ozncAqkCuSf3Zp28z8yUoRn6zljb4zlhmSDv6InU3EvNCwAgG0fCdEpD\r\nLGuJUk/Vjvgb+tULtikxRmBGelnkw8qma6NtmtNa7T84sX0bMZ10VKgap+oq\r\npzKSiJMcmo4EAwnsbjcLcLdpwh/ewqe3yCA=\r\n=NVIn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-ddf4681_1674161426197_0.47108091951753694"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-484a8ae":{"name":"drizzle-orm-sqlite","version":"0.16.0-484a8ae","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-484a8ae","_integrity":"sha512-lM+fi3SX357hk2nShwSmIhL3vPS627Zz/uGy/WxUleJFkE2wRSBu/yBtQwgKx7fq4ra3R4/PFRQW5FGtvJ40fw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-lM+fi3SX357hk2nShwSmIhL3vPS627Zz/uGy/WxUleJFkE2wRSBu/yBtQwgKx7fq4ra3R4/PFRQW5FGtvJ40fw==","shasum":"5d53c66d4aec323d9a58912de9cbffcc06fa4a67","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-484a8ae.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrGJTtMmi8aoTJN3quP0xAdxu3MOSyS3tRUOQgmplPOAIhAJyiwzai8sGsGIpPSpRl7LWrrIs1hREFYNbvbNSvgSov"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjykg/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjSQ/+Jb8l485C7dER6FOH3d+j62EijvK4pk9VrJBKAE7lLgQNECJ4\r\n4HlTaeUFu/3cGYa1hb5uPf0+6YARc3cQOCnnkveJnrfuZsqxgwpVC76p3uvh\r\nfiaejRsh8a5bBWPUZFnyVbYdzlDF51VQkznvJ4Yz0+DuszjOqqVOdkfulers\r\nFJZUTfr1h2P1giTixepJRRCbr2FTAbF83Iksmtt5Hk40QRGPYeU6zxIH5qaN\r\ne9Qpg7kCepMFDXenrHLEym5EK7FUqyGGhvDdU0q4cdVyI7c55HvZO5FhWGMA\r\nAqG3BS+GHObqzwCCDIDVsssK7tW2BCle6IMHy8hnxe2reFeOnvdxKVaf3OVU\r\ndb8+zwAyj4RZk4gByZhjeqJBhKJ28HGSuRW3GyiI1Ua8lYpP0J0pWnllnf2w\r\noyt5638VovX0RtEmf3jgEVeXLpxBMLhoFZIE8c5t2XxvSVTR9OZihpO/WSQb\r\njQMUWIxMsoOjQjWvQ9u7K5GfotxApwGKX5FBZc8IahFtG2WfBBKl4muAJg4t\r\nwDPiu/POBISj25XsAVTp97RGekljfzv9Kg8Gz6B7mN5kpuNe2K5MyKTj+fdI\r\ntLOOBMF+NeVypdOthi90KtFhvcMpSrMuDd20ktU1HjmynQerhR1CKpGWI9EI\r\nXE4ZCKq2v0F2vSNpjhP+qBXR8VZLmXHnYQw=\r\n=5UJZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-484a8ae_1674201151230_0.8867644591823611"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-af45b90":{"name":"drizzle-orm-sqlite","version":"0.16.0-af45b90","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-af45b90","_integrity":"sha512-U+V+ai+Qo1ygJA5znL+IVnESMpdIdotfUdqc7jI7lYXocTk9N1fLoNMvMwA9uKlEjlesllr38PChs4oAduf4/g==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-U+V+ai+Qo1ygJA5znL+IVnESMpdIdotfUdqc7jI7lYXocTk9N1fLoNMvMwA9uKlEjlesllr38PChs4oAduf4/g==","shasum":"9b5fb929533e466a4957bdf31bf94a2ce5dfb8d3","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-af45b90.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqH46hPlvJ/sz1exVJNMykf3ztkjOXyKrSR+2r5iG0iAIgashd5KutIYLUEWb/5a60+CRjUPBJx0fHWT4U0NQGeQ8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypUvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmofbRAAlq+8aBzFGlFNloYcEqKKYJ10U3b0KwGMUYbXSWkg2Lpi8sjM\r\nKSInmmUq5qHmuxXm3EwQOcPz1Ch6d2UdCrJKgSFlq1od/53IPhYo8yARubBY\r\nLjamP95wcOFgXDD3ySy91Gvhji2BPNw9m8K/HE3HCaSVVNQTl6hLOU9wbHiU\r\nBgzis/vp+W7SH2kJsTtAdJEnGAExBcGzibTVbtJVFXxFGxGgdTBVAEarUsfO\r\nnXZbIYz5MUBdNTtgkRpn0QKmIgvQ/9NPjCO8FRvPvS7NSyYv5nSVy+Jy3Z5y\r\n/u/BA56DhYFyqiHxeJW/CK0LIZ5DO36tpUH494O1Fpw34M5yqBuJ1b6UHsWu\r\noBnWYxVchj3VFF/6c9qd1roSoEn0Mlt7m8GlcHRvbfpwLwyZD+hSC+ls0dXY\r\nbZEfR/ubxrgtQvlFejdYSkGnCW/v/ulT3Eck4tIVCDf1jMcl6gwtJDvWydVd\r\nVnEyoIju/b59aE8nyZOiPTXjngB3dLor+WY9VfZS0rQcmHz6jGR/eR7UNHbj\r\nB1hayIcLKtoWLqbIR08tBxWzVZ67KBaYQZj1rjPpw+U8zfhppduZvKVD0T4r\r\nLDYu0NxU7jh1/Y1q8UYtfrXyAbfMndek8xtcUycpFZmxS04wLQepx3v1waJn\r\nqCZXIKeoDPMGYMD+lOHeISGL65a7sadpF/I=\r\n=eYmi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-af45b90_1674220847611_0.8496470381057522"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-b9e9ba0":{"name":"drizzle-orm-sqlite","version":"0.16.0-b9e9ba0","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-b9e9ba0","_integrity":"sha512-BIUw0804EOkpHs24x+pMwl2Ild1sxYOexljBTDfGftLrTH11hIF01Bz9vaFkrtkPuGTJv0GOun3LduxLJ+YeYQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-BIUw0804EOkpHs24x+pMwl2Ild1sxYOexljBTDfGftLrTH11hIF01Bz9vaFkrtkPuGTJv0GOun3LduxLJ+YeYQ==","shasum":"387d767defb377b47ffb0be86c4ff7ef5394e691","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-b9e9ba0.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICqi4iQVEvXILClhHAGxnmaWFMpxn1W7OzlPDoKgIFU3AiEA9u56OGciBhSJWbK9NibWItBhVIXUuJih6Kzfu1L78cA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypmsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq8Rw//Ssh8lhenJWp4u5ApTYlVpqTCEE9mx7SNIaLgOeU9n/OELZCP\r\nz9CCfo17W4t3ILmFtTnkog7vsECm7DDqFM9N6nHaeyf+FkhH/nmtuKt7wRqv\r\n6O+mc1qhqC6RRGROVLzhDFwefAjK1BjJ+VdOAU+Qt2MeBXrsn1qtQng+czjh\r\nfMkWrbPXZQSLxQpQXEl7RVfyuOXvluuIDJcmbQrs9Fui3KG3CT6Ie748fPuQ\r\n6YdilGIHsbIh8Af0Z60s0pS71xpUOHTy6btVAe55A4JVmamPwk19TSneULRK\r\nZSLlgruearQZO210n8vTkP7sv5OQzQvZ8p1QYGOf2X9J3hzpfOUQpBDX/Vs/\r\nwHE/hvDdCGn8Vm0UAyvPPghGv9yyosO5bpVkBApSuiIp9czNRT2o4LM35Y52\r\niHiQjBAbP9QFEXoQLuWnOWVp+2Z+V/1DXBM7gS8cygB7g2fy36rm41FUL+Nj\r\nJZ6cq7PMduxicDSeqv+bjK8aYD48MzcDiKMoQu6lkEWnmzSWOIjpQCpaOgns\r\nPj4tp6tResyb/msoTVekoTWYt5/UsfOd8ESZh058DrPlmfzTZ++ekJwGtorE\r\npsN8hGJEeK2wXSy1sAIiHecyMZWMOckCqbSSz2dhQS9tRk9Hb6x8Oxt6dK2p\r\nHBn/7xRpU8ATxPP/doz2HBm7c78nP044U5A=\r\n=DSLU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-b9e9ba0_1674221996375_0.9656760515330927"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-4124cf0":{"name":"drizzle-orm-sqlite","version":"0.16.0-4124cf0","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-4124cf0","_integrity":"sha512-VHJwEExvIRnmQAmw1t1cETYOQ6yck2zPPYmUWgoU7VS362RwyU20hSq+93s4ksZV5/Imc7HQTSKujoBGqOvtzA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-VHJwEExvIRnmQAmw1t1cETYOQ6yck2zPPYmUWgoU7VS362RwyU20hSq+93s4ksZV5/Imc7HQTSKujoBGqOvtzA==","shasum":"ba3aa0efca0717bd7079d8e8fe026a57634bccb7","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-4124cf0.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGQ/AczWN6d9/bDykQC2rxhKXlU5ICPreRD9rJpAiG2+AiEA/pe7/z+/Nc+LlD2sgYNmCLIHOrT6b8IvX08f/KH1yv4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypu+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqu6g/9HZtOvQt5HmascT3tdk7Qbi3hbRblRJuVOvSoB1wLRTqejMG/\r\nlhRLJMVG/u7gNHjdPaor2haKr74a/EApv3GQHir9XkK4XnMFFlL4/+BjKtUS\r\nQ7h0WMyEZpKil+nimUG6XkJ4wclZ+NPF4BAf05z0yvmVn7cTCO+hEV13RBxP\r\nBxWqeyA4Q8PJZgvQAtwBBMjaEpBtvUOrn47zs39FjvmgpOtjLIDqMN5WEhwQ\r\n3e0CO+s2Npa+C/nuHZyYJSpiKLyI0yeePVZaRRZpVf5+koCEKFn91GM4mMjz\r\nZsMF8HW6kZ/OR3RxiroAsecnim5Wi1uE9WeBGy373zrehvQxtnzBXS0/JMxH\r\nL0OcLqLqsqHZWD71CZ/mcvaR1Nto95aQstksLgjf9y9W6XVMpIbnsBXH8p2C\r\n9/ZZyRApn/mITHuVhkZvQFRmNTCxJlfoKUEHIshvjb9XrHdZ2KeM9GMBvsVa\r\n2cghtWGU1Bt2gN7w6yTyRlXoM1sn6xZJDMPhv1TrDshjM97CD+6BwXejplYz\r\n4TTHx7QxluIbabhxYj71EQfKWZ7naaocNPFkFxl15BQ0pxu0Fa2bjswqePNK\r\ntTh25Feqr8fgv86Bnu6xZsCUsCAMOELQfhuv7O+5mCE6Xf6mR1dEO1oqbI+U\r\nYg0GG21maySWoTBu3ABSZZePE5VasTBmiGA=\r\n=vL6x\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-4124cf0_1674222526722_0.9606263247420208"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-51c77ba":{"name":"drizzle-orm-sqlite","version":"0.16.0-51c77ba","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-51c77ba","_integrity":"sha512-bPdxtDKR3ILbbX79DE/AjREQLebzAvqrJ2hEfKebXtsHEAxguqssWlIuLcMkCFw4sCXTY8Vt71DGQ8m0s/KkhQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-bPdxtDKR3ILbbX79DE/AjREQLebzAvqrJ2hEfKebXtsHEAxguqssWlIuLcMkCFw4sCXTY8Vt71DGQ8m0s/KkhQ==","shasum":"eeff9c2c00bc15d7556831556f9e40f911684b06","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-51c77ba.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUnk8VBf/e1sdsgdhTTt6uqN2drp+kbhwLBW73aczb7wIhAKxcM6sJQO+Tte26l3tmAgByd9VmmmWTJ5v3KWdCz0dm"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjypxBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpl5w/8Dj7qtW3ZFlnD/mnTGK0liO7FpQzoulXvYvw1bdmxDODTABAO\r\nqmqL+G6DzqE3GNjUWgPDPWfjGUBXg1rxHQ/u6DXaFhDsVPkRrrHuD5JwV9CF\r\nNdQuzGXJCXAHBNWAMVUwmtHMpQNB9vMO4ToOLtLXxkBmUxN8SsSPy47D2scX\r\n5M0si64mhK/+0qjbPUhvz3+WMjnO3Ncy8QeNwRTTldw5+CZu0sYjP4oTmEoi\r\nBDp6d+goB1mbuqu+zR5UIIYEHnoQnWBG6XJb1QEDj0sH3rA1uD4Sz7W0JKMa\r\nGNKooQ0iafzTjBRvFYdomEY6CmPfrFLGT3MK6VcYf1WOFA16v22qXkjkhugT\r\nYgv6vZzw1H2KRzOF7KWnHKRS6uoevVugJm5519IDB3jHRWfU5tjLUjjhR+R7\r\nFnw87/WNJs0lc5mR8pPUTXhw0F13nYNcQyXxxQUE8ajURuhUbse/FckXAbEj\r\nAq/rUBT/n7nspZb72doA6m5N40WYiTFz8Diz3v9xPGFdh5qP78r+kkpL+ESs\r\nloZA0DaKW+j5ZbcvJ6v2vSswNQ365ghMk1Eyf09816O4B0qFDqGReBg4JTuF\r\nV8ow7nEhFWqe4US88Geu+vqMC1Xk2IF5Gx8R3ARoz/F0dRjwJjN9frOnMoPk\r\nJuEUZm/dXy9kvYlt8Q2mg1852DI4xAVY2uw=\r\n=dvls\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-51c77ba_1674222657551_0.719092850992997"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-cf5a510":{"name":"drizzle-orm-sqlite","version":"0.16.0-cf5a510","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-cf5a510","_integrity":"sha512-B3jG6rM6LikzOtacYo+zIVk/zkklzYaer5Yv7NQMVaBt5WddTHMNs3tI8SIhOug77lmIzb9OpXF3CIj3rlOYlQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-B3jG6rM6LikzOtacYo+zIVk/zkklzYaer5Yv7NQMVaBt5WddTHMNs3tI8SIhOug77lmIzb9OpXF3CIj3rlOYlQ==","shasum":"90eab5eced3ad900e0d087ccf57ca2eda71d69d4","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-cf5a510.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGNt04fMIUmS8olMgiCa9/9pRxdW2lbG7yst60JhLUSIAiAoknPVaNvjLKTqFBH9ysRMPRW2h3ROwNOWoSj6FDZdsQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyqmNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr8TQ/+Mbr1KQE/v2we0V7/PNses1QIPsDKMu19YUFp6qeocMI4oXs9\r\ny0BTT4OjDQ1SK8ifr7Ggnczw1zQGs8CERKqDmNxy80FjqKLCoE259fGmqFqP\r\nduUQzC3hsL3EjMk0DdrGyK2RnUhZtWozKFNzUGiE6G4ZMDTOsSnB2giuoQu9\r\nbr5uY7SevaHD13urfPL6Nn0Dv4GsRCX1/J794R2ACcMX1Nqmgji6PUPrmiU1\r\nRARjJkBLXaoLLi7BailTkUQGlRKf1EFp/T26x26Bi16ttGbrnRtYpAhxF5TX\r\nXaWGA9DwHIo9iFP+psw1E7LzQo+B+Yr6GG2/S9iMzfB79qywAP2HiGEragHt\r\nUwHUtMGvzeQHBYwUi0JWKIF/uDpyWBGmdLrMJb/3zrqcnw6rYrr4k+I5tqRp\r\nUM1ow5MR73ltUGOeXth3y0nbKlazdN1hM43w6s/pb2Hq1SP1vq/zCE2x4gRC\r\nmVmBtw1BI0TudR01/TuFta268GvJt9q6VFe7ofzBAakt3BQoraWJMAC4GGK8\r\njn0SQg1mY0Tht/XsOsmhiBESw35B46gIeNBMsXR2fEZx8hfinREYCT5tZMVg\r\n+jn+Sgqz4xXA4QpsaVcYW/fPWI2gKWt6tpJLSMvLMxG/Wb1bWVn7yrlCTBFA\r\nFt6RGVxnyob32adrHCgz9Uc0/UIpXXQrC5Y=\r\n=sL3U\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-cf5a510_1674226061649_0.362539455692688"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-c522f26":{"name":"drizzle-orm-sqlite","version":"0.16.0-c522f26","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-c522f26","_integrity":"sha512-/1Bq3qNlyUzbte5QUG60p+6xH/RJ536D56bHdGt8M3lSCC1e89KeI/AU8XOHPeIF7nUbrQrNIcSqGjb1dPihLA==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-/1Bq3qNlyUzbte5QUG60p+6xH/RJ536D56bHdGt8M3lSCC1e89KeI/AU8XOHPeIF7nUbrQrNIcSqGjb1dPihLA==","shasum":"64dce1c5d1a314579b75402d818eec53e91ccf53","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-c522f26.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGMFndWrKejYYDtEVhLsNv1PdqmPBzcYYJeXxIZKy5LKAiEAnLGfs6QyEdpORWP768US46bd7/1ly83rMyi1Jf0yPIo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyq0rACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrW8w/+LgXMRnY3IraZy88bPZcqGpdzlLtY7oHI8UCXjCJ1TMWxgj9U\r\nhFdKeSnJ6POXLvFTyVe+mBF4BO7OiiLRmxajdqzIPBwAUwcmyDB96XSCbImv\r\ndhTWSSIyDQ1IgLMAbc1M3DKwcy+tyMYwp7/KBpcmtBG37L7qbEIJCVfNM7qr\r\npoYgNO3Bkzynzw10oIR7hnVnuQsajznnAHQ/6GyrVFaVFRbHxjUA0KRsma/y\r\nGq74H99CuJbMN6GCExTskCXohxp7vOLovn2Nqn1BC8flZL1hjF4pFnv7RHx3\r\nOGEWvvY16xuyXEI3JAELDwdsDF6Aaufi3W5EgKhHLsQx3x154zlzAlbuDFVs\r\nEa/X9ylboPfwlgNpMVBVpwCY+mBWQrgpRzGSYoMaT82PUOptRTnkkCwrlgeb\r\nyaevUuLlASvQGnDeSiU1ildumbt86Dw73HjnoaUfgTptyOQkUb3OnCb6Vth/\r\np7p/V4kNguTw3Anb9/fjrDXAInmyrTuMJD5GEcNCnjb6WwprxY8KLYHsP5wP\r\nIZcyReGeRYEQR8VTJDoA0P4G1o+gVIT7JtJhrvxljWvSxg//nWe1ud6cWbof\r\nhKwqvwyYB+GejXVvUoE3+H+n1ZRslcNHuK2WSWP8bwo9XrCWE+gpPfKE5MZT\r\n/+K2evBZxHtRCaN/ohiY96e4T+3BdmCyQNQ=\r\n=n6q3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-c522f26_1674226987643_0.17987937156822387"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-97f9977":{"name":"drizzle-orm-sqlite","version":"0.16.0-97f9977","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-97f9977","_integrity":"sha512-hk8ZOLbjDPNcXphQfoysHsN1/h5UKMjqm2r9sywmV06aPjEQoPOxIjPjkutjlXeISsTTiHU+GvxXmVkzD78srQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-hk8ZOLbjDPNcXphQfoysHsN1/h5UKMjqm2r9sywmV06aPjEQoPOxIjPjkutjlXeISsTTiHU+GvxXmVkzD78srQ==","shasum":"50fa28dcbd0c47439aef1e6e4c4d316f5413da5b","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-97f9977.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhL5A91/16cgUXW14iPVdPJzsCzGkuWUEJVuEr8KXrkAIhAIG+n0Wj0uN0g82URUkIoUtvWB+u3E/uzuBYQQxCBPEH"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjy8maACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrY2A//cht+EHXpaQ1j38sA3Kqz6tb7LMwZaez2VW6jmCn/jTULtlUM\r\n0CItO9McSF+j9ecbSN5JzbaluW5zwd3mrq32p7c7TYxmJ9mk/UXo4Hxy3Mf3\r\nofP4uGs5pKMWHqVoa61Vmw/yuJ9LtOaz2jdZvNs8UUuFLDIoSapgIJFDEy15\r\ntLgkkNsLh5dwBUYGJSsW4ZKC66NWv1oudwyFTupMe2zCxwu7SDC4E+eEr5fN\r\n2ApkP4dD+rWGC1o/B1QSrbSXoCm1bbJZC+xyzG0OtX/oUmfwNGPsXuTegLem\r\nq0B4nQBFu0BdBEbjY+LJYVW/cbMEIDrJg5CKn2L0K0qJ8gssGbBNogzUDavH\r\nzCVJKTlBu3RCo8LzTvZwjia5zgctL2jF88M0xwcvT76LvqtIQbShncna9aGU\r\niAPIMf9+45HrD1mzn0hRpJC2L1rXdEve/j3XE59M6EQCoPfbT77rejowBSyA\r\nT6DsJDYBz2U0z3KjEXb+OgCETxDynWRQg4EErCPGijqpLqHChanCW88bPUHd\r\ndosGSCCSlP+38+sf387E35lo876+pkxt0NWDSK9ZWRbA+EJEIgGI6KqOU3JX\r\nlNqzKf4qWG3rszF+MfDG9xNpGWiER0zxGZeoQg+woB/uCpQH/emsO78cVKFu\r\nczuzncxHgpdQbPvUS1VuI4a1XxeJpzbFCp0=\r\n=xHFu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-97f9977_1674299802389_0.6509033917342677"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.1-43776eb":{"name":"drizzle-orm-sqlite","version":"0.16.1-43776eb","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.15 <0.16","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.1-43776eb","_integrity":"sha512-I3wrYXD88RyjKAByLxBOZjzz7hmBKU48yTIH1nrnxhH72rTXGt7RTijGb3iCGQ/SBBsYmjyRkaz/jIP+dHqBmQ==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-I3wrYXD88RyjKAByLxBOZjzz7hmBKU48yTIH1nrnxhH72rTXGt7RTijGb3iCGQ/SBBsYmjyRkaz/jIP+dHqBmQ==","shasum":"2431bcabb9d6bcc267c3e7c031e31519e1193f22","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.1-43776eb.tgz","fileCount":190,"unpackedSize":267800,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9oZ/sDHIK5K5UR2oI5V21VRUh0A4zf86X2mFn/kbknwIgc+cZbMxQLCX6MKJaG5qEixtgD6NHexiM8R8yC9GqcJY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjzTq5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9hg//V9l6bb39juyb3m93MysHbfWh6BUj5+f4wcWV7YSZMMNmHSyP\r\nLE9/kL6oe7YY6PfT6OcX74cAgYN6F134BC1yIlndbZpGd51rifMkKA2U6N+U\r\nru2IQAaCu+ZNY70pjEpGiiEIYHhtEdl79V+/4rNNmN6dQtOGL0AZ3VAR6ylU\r\nPOS9OJgnr+N1ESY+frM5Vco68V6N1fKFLusL2BcH7hggJ+ZodiFVDNlzwAJc\r\ngttWX1aAJXw9juzgjOAxrsHsuLuQSXBiLPTFSb0BlBhNWw96YrP2UFsbKILZ\r\nV2eOVtlXPLSbKHzcS84OPxn/0ohIYa9bfpUC3nSltrEeQPvAxcAiMUKus2rC\r\n8MgLApnE7WgOJbfufZdf8Ig/nRCnaWzFgPaDjvPf4xkJrSDTpunh9sp7oZJc\r\nwh3W3Bni6g0bzXKuNQT+NNMG4/f3TCzP4Kn2gbL7Aw2TUbdbyJLsXWmF71x+\r\nPVduBhcOwc2cBFg9V8Ze+Fc/pqwGo0+9ip4Qzhzt3WCmfMQeQ72pu32aucgN\r\nUPDqBCem9blFmCaqiQH/zxiMP2QOTVYSeRa5uNVbeZVoYAHwIwpGAq7OxNY+\r\ngI+rZe7Zy1NWuq4I1kWDlI94hEBQlK9xHMp9yRtaezib3vl17NKzusx+4ARR\r\n/dd8aqr/GadWxDLsGM9bwGpn/iqzfI8hIlE=\r\n=mAG8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.1-43776eb_1674394297699_0.6800628820006851"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.0-2c4c5b1":{"name":"drizzle-orm-sqlite","version":"0.16.0-2c4c5b1","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.16 <0.17","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.0-2c4c5b1","_integrity":"sha512-QVDbSAyyWPMs+I9d3UFDGI30906aMqeImDbPixysxEPBuauww3rCK1maTJ2B0pzgYwHuw0s2Ni4TTL75aKD/iw==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-QVDbSAyyWPMs+I9d3UFDGI30906aMqeImDbPixysxEPBuauww3rCK1maTJ2B0pzgYwHuw0s2Ni4TTL75aKD/iw==","shasum":"83c9012d9a23cfb559893bb5bd27e7dd13b1d4d6","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.0-2c4c5b1.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCHwTNmrZFs+eVi00XibDQ9YGJt5bMdL49JjeeWmglxBoCIQCH05yX7hJSjP5S1rIouzMnaFwkEzF5SjPYF/wi197eqQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4R1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoOqw/+KXsQIg5FENVnfvbngEzC2dote2cvPHwETVMDvQ6MKMZo/NJ8\r\nTqR6a/DOi+OeQPNGCXYOrZsfiu6gBj/oSudp9+CKMkEFyL1vfbYNtbeZcaGo\r\nKwbgG6r8sBGHd6RIhVI9MxONhJ0xwpNZBR7wSJIEu5G9jnA8d1nGEprgeFum\r\n78VeH7SLzq7v4cndfHbQJ+/Cc+I9n2CDvHQGvAvaZMu1B1idSWa6j13iC01e\r\n6Ll/qlxTagfIdfmdeuPiCg/MwWAegK8XlBGR3QSrq+qWLNas7dVZrXGshJQA\r\n5SJI3YkZ55O59UeRFAN/SPnMJ4GOR9O8ZIVYKwoRmjtbYj99UTuFZY8grlDA\r\njWSCZqNsVfmyd7/oXcVTVxJnxGkJbsxlvLwydE259iQVKKuUbQF4ir9uvC6D\r\nNL0+0+nvemyWvK58AEW9U7J+xzVc5HNn7aQJD4LnoiX2DCpl7QOWo8lq8i8g\r\nGsX6JI2AQTBGJ3odsaFtP/NixagC88z5vfOTAnq04yVwIMY7psFNCj/8ZD7i\r\nUrsBhn2ZCNKWlWpBIG3/ZOJKnNMeKai278c/hOIvD1IaONFicuSTYbYukkRZ\r\nJvuWqc5K5+7P7bzILJt9aBO/OmSJ7PwvVNtSbZw7KjjFM8pvRuJJ9Ulx9Gvy\r\nD9zOqP32vfWGGidVjplA3UQHvqQ40srAHKg=\r\n=DD6i\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.0-2c4c5b1_1674544244945_0.538840301505713"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.1-60d4ce6":{"name":"drizzle-orm-sqlite","version":"0.16.1-60d4ce6","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.16 <0.17","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.1-60d4ce6","_integrity":"sha512-oOoOktzEpazn5Rmr5dTYLF4v0cI2qahUAshOoR8U7jEFXXFrmD5dhJD9t5iOpO8HMC7T9tWE0yiNLMbZBTcQ7A==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-oOoOktzEpazn5Rmr5dTYLF4v0cI2qahUAshOoR8U7jEFXXFrmD5dhJD9t5iOpO8HMC7T9tWE0yiNLMbZBTcQ7A==","shasum":"44da19f476597e5d9d13e03c9978d7e65cf74ad6","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.1-60d4ce6.tgz","fileCount":174,"unpackedSize":251046,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTWO9C62YO9mZL/5eKU9KnjKF5MqJ11yFCMBpsYLCAfgIhAMisLmjONDxNocXUhjIOmJ7LLPZpqeDVVGPody7l80y/"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4ZzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpNhg//RGDfflNWKVJepvcOv+Bpbep86Ji268UI+evu3mu1q1xNXW4d\r\nc/fvHohdw6zlf9HU3QPm7LQdTlStz8omaPHon9CcsrB0jmK/I31Mm43wrJ3G\r\nbY7AzaubdOaPSbxvM3e6wL2tYGgtPg+vf2A2fsosiRnmw/hGmxxyVS4i06Jn\r\nLMIamYp6pCzsdv7s/QG6zT4pDKp3NL0zVhzU87S7h0fSAP/GCz+yFhJcB8X/\r\nM5NtUKVZIhn58mgDpL0/Q6/flALiVtCXkfpYLC8hfd6ZNElBd2NOqk7l9u6B\r\ngTu6aCdKjfhBTMLqyodVhHBnIXiIUtkzTjlKFbfqx/lbZUtz/Xx78a0Coemb\r\nBaJ3RPw9GUll1rxGM1yXvsw+GMOMfG20x12us5uV6puF2gXmW04CSDnptFCh\r\nSbHxz5+Y5pvCjtNlEibXq/Xyg6wmlYt6fr2EWBN+pCz6Y13NrX834V1ambqC\r\nW8vcE0xtN3cI3PiJkMgCC56EOGSJM3Edq6trYkKTR5e6muKr6uhR4l057QCb\r\n4tIYLazAVn1QFKmKnezcmaepyrNTbeyQI7mJ5sdLoWoHLEZPkczWlw/cq0cA\r\nQdqQN0Wd0aLpjIsKfLFYeIb4Yj3uxaLuge3LHDQ5NroeCdwBNucHFMkUci1d\r\nIOoWazc2dzLl4YoAJLgonfyj7cq7DujcoMM=\r\n=3brb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.1-60d4ce6_1674544755205_0.5252827696940183"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.1":{"name":"drizzle-orm-sqlite","version":"0.16.1","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.16 <0.17","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","_id":"drizzle-orm-sqlite@0.16.1","_integrity":"sha512-3fjggI1rU8hIFObxp8RlIlEKz4zaij9p6LA+/uWfaHCKxXBIWtH5hUA5MIT1NMK3KPzXBpfkzRqtljxPzKOX3w==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3fjggI1rU8hIFObxp8RlIlEKz4zaij9p6LA+/uWfaHCKxXBIWtH5hUA5MIT1NMK3KPzXBpfkzRqtljxPzKOX3w==","shasum":"db2885177eff6c27919b492f9b84a9884134eefb","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.1.tgz","fileCount":174,"unpackedSize":251038,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA1ljKgWxV0zLF4l+sEz1zE+Ya8L59GnZrSrcM27Dg8vAiEA7b+qSZMrta8VlF0yclV7259u6epLqJfwZvE5BS/H2/k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjz4rAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpd1g/+IOj/ugos9rI/9KTnOMsGdaoBlDUcZEY2XHza7Ox2BEffEMT2\r\nuqWDQqWMLBKkovYtr7eiV4OC8IIKRG08+hOt9zcnuhgpoGGyMroqa3uIEaT/\r\nKWNn0zRfZJI+5wih2u4sBbGDp8ue1+9SOXS+WUNkc0wKLCwZyLFlM/opHYfe\r\njYnm88p120pwE1+wnpwQS7G6feP9+WDR3weptY9uB96ryf+ibvTZp+d7gs75\r\nC8NPz3DLMlbWBrVN4g63vqEW1FZ0rpsKLJ0s34k+ExnGEcWPyr0pwIOBtQpL\r\nQSZrHeNffGRLDILDGAahhnHfsznnSHXQDhsBJp58MqhtTXgH14+puOOevOVV\r\nIVSW22tkmvQwzdSHNYAOTLNmmw+WpIM8Pkts9hvu0fY/sSO6lIxa6+K1V2hy\r\nUtfJ6RgHGFCgAT21PibjQghGhZNFR1ThZ89GcHBsTcNP85oshZ3r8SPoQLlU\r\nn3ynSiOEr8LbOh8K4i3v4lEHii+FL3bVY3XF8l837VLP5Agz59L/S1a+qzPb\r\nsAEaGJteWgfvZWBR1oQeIyaCRKoea+00iJUj/FrYLVerXXNvkS60wQq/0IGT\r\nhACmGlwYmJ9/uqiB7PI9ErXxNcdarZm3L4fXuZvN/S5lR18OPhMjhu3oGsuI\r\nNTZtsky0SP9LWUZ0LTJYfSbE/DEN85WCLgM=\r\n=g9EC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.1_1674545855820_0.3802357288942051"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"},"0.16.1-78fb61e":{"name":"drizzle-orm-sqlite","version":"0.16.1-78fb61e","description":"Drizzle ORM package for SQLite database","scripts":{"build":"tsc -p tsconfig.build.json && resolve-tspaths && cp README.md package.json dist/","test:types":"cd tests && tsc","pack":"cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz","publish":"npm publish package.tgz"},"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"keywords":["orm","sqlite","database","sql","typescript"],"author":{"name":"Drizzle Team"},"license":"Apache-2.0","bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"homepage":"https://github.com/drizzle-team/drizzle-orm#readme","peerDependencies":{"@cloudflare/workers-types":">=3","@types/better-sqlite3":"*","better-sqlite3":">=7 <9","drizzle-orm":">=0.16 <0.17","sqlite3":">=5 <6","sql.js":">=1 <2","@types/sql.js":"*"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true},"@types/better-sqlite3":{"optional":true},"sqlite3":{"optional":true},"sql.js":{"optional":true},"@types/sql.js":{"optional":true},"@cloudflare/workers-types":{"optional":true}},"devDependencies":{"@cloudflare/workers-types":"^3.18.0","@types/better-sqlite3":"^7.6.2","@types/sql.js":"^1.4.4","better-sqlite3":"^7.6.2","drizzle-orm":"link:../drizzle-orm/dist","sql.js":"^1.8.0","sqlite3":"^5.1.2"},"types":"./index.d.ts","readme":"<div align='center'>\n<h1>Drizzle ORM | SQLite <a href=''><img alt='npm' src='https://img.shields.io/npm/v/drizzle-orm-sqlite?label='></a></h1>\n<img alt='npm' src='https://img.shields.io/npm/dm/drizzle-orm-sqlite'>\n<img alt='npm bundle size' src='https://img.shields.io/bundlephobia/min/drizzle-orm-sqlite'>\n<a href='https://discord.gg/yfjTbVXMW4'><img alt='Discord' src='https://img.shields.io/discord/1043890932593987624'></a>\n<img alt='License' src='https://img.shields.io/npm/l/drizzle-orm-pg'>\n<h6><i>If you know SQL, you know Drizzle ORM</i></h6>\n<hr />\n</div>\n\nDrizzleORM is a [tiny](https://twitter.com/_alexblokh/status/1594735880417472512), [blazingly fast](#️-performance-and-prepared-statements) TypeScript ORM library with a [drizzle-kit](#-migrations) CLI companion for automatic SQL migrations generation.\nHere you can find extensive docs for SQLite module.\n\n| Driver | Support | | Driver version |\n|:- | :-: | :-: | :-: |\n| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/better-sqlite3'> |\n| [sql.js](https://github.com/sql-js/sql.js/) | ✅ | | <img alt='driver version' src='https://img.shields.io/npm/dependency-version/drizzle-orm-sqlite/peer/sql.js'> |\n| [node-sqlite3](https://github.com/TryGhost/node-sqlite3) | ⏳ | | |\n| [bun:sqlite](https://github.com/oven-sh/bun#bunsqlite-sqlite3-module) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/bun-sqlite)| |\n| [Cloudflare D1](https://developers.cloudflare.com/d1/) | ✅ | [Example](https://github.com/drizzle-team/drizzle-orm/tree/main/examples/cloudflare-d1)| |\n| [Fly.io LiteFS](https://fly.io/docs/litefs/getting-started/) | ✅ | | |\n\n## 💾 Installation\n\n```bash\nnpm install drizzle-orm drizzle-orm-sqlite better-sqlite3\n## opt-in automatic migrations generator\nnpm install -D drizzle-kit \n```\n\n## 🚀 Quick start\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  fullName: text('full_name'),\n})\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = db.select(users).all();\n```\n\n## Connecting to databases\n\n```typescript\n// better-sqlite3 or fly.io LiteFS\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// bun js embedded sqlite connector\nimport { drizzle, BunSQLiteDatabase } from \"drizzle-orm-sqlite/bun\";\nimport { Database } from \"bun:sqlite\";\n\nconst sqlite = new Database(\"nw.sqlite\");\nconst db: BunSQLiteDatabase = drizzle(sqlite);\nconst result = db.select(users).all()\n\n// Cloudflare D1 connector\nimport { drizzle, DrizzleD1Database } from 'drizzle-orm-sqlite/d1';\n\n// env.DB from cloudflare worker environment\nconst db: DrizzleD1Database = drizzle(env.DB);\nconst result = await db.select(users).all() // pay attention this one is async\n```\n\n## SQL schema declaration\n\nWith `drizzle-orm` you declare SQL schema in TypeScript. You can have either one `schema.ts` file with all declarations or you can group them logically in multiple files. We prefer to use single file schema.\n\n### Single schema file example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📜schema.ts\n```\n\n### Multiple schema files example\n\n```plaintext\n📦 <project root>\n └ 📂 src\n    └ 📂 db\n       └ 📂 schema\n          ├ 📜users.ts\n          ├ 📜countries.ts\n          ├ 📜cities.ts\n          ├ 📜products.ts\n          ├ 📜clients.ts\n          ├ 📜enums.ts\n          └ 📜etc.ts\n```\n\nThis is how you declare SQL schema in `schema.ts`. You can declare tables, indexes and constraints, foreign keys and enums. Please pay attention to `export` keyword, they are mandatory if you'll be using [drizzle-kit SQL migrations generator](#-migrations).\n\n```typescript\nimport { sqliteTable, text, integer, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\"),\n  }, (countries) => ({\n    nameIdx: uniqueIndex(\"nameIdx\").on(countries.name),\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  countryId: integer(\"country_id\").references(() => countries.id),\n})\n```\n\nDatabase and table entity types\n\n```typescript\nimport { InferModel, text, integer, sqliteTable } from \"drizzle-orm-sqlite\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer('id').primaryKey(),\n  fullName: text('full_name'),\n  phone: text('phone'),\n})\n\nexport type User = InferModel<typeof users> // return type when queried\nexport type InsertUser = InferModel<typeof users, \"insert\"> // insert type\n...\nimport { drizzle, BetterSQLite3Database } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db: BetterSQLite3Database = drizzle(sqlite);\n\nconst result: User[] = await db.select(users).all()\n\nconst insertUser = (user: InsertUser) => {\n  return db.insert(users).values(user).run()\n}\n```\n\nThe list of all column types. You can also create custom types - [see here](https://github.com/drizzle-team/drizzle-orm/blob/main/docs/custom-types.md).\n\n```typescript\ninteger(\"...\")\ninteger(\"...\", { mode: \"number\" | \"timestamp\" | \"bigint\" })\nreal(\"...\")\ntext(\"...\");\ntext<\"union\" | \"string\" | \"type\">(\"...\");\n\nblob(\"...\");\nblob(\"...\", { mode: \"json\" | \"buffer\" });\nblob<{ foo: string }>(\"...\");\n\ncolumn.primaryKey()\ncolumn.notNull()\ncolumn.default(...)\n```\n\nDeclaring indexes, foreign keys and composite primary keys\n\n```typescript\nimport { sqliteTable, foreignKey, primaryKey, text, integer, index, uniqueIndex } from \"drizzle-orm-sqlite\";\n\nexport const countries = sqliteTable(\"countries\", {\n    id: integer(\"id\").primaryKey(),\n    name: text(\"name\", { length: 256 }),\n    population: integer(\"population\"),\n  }, (countries) => ({\n    nameIdx: index(\"name_idx\").on(countries.name), // one column\n    namePopulationIdx: index(\"name_population_idx\").on(countries.name, countries.population), // multiple columns\n    uniqueIdx: uniqueIndex(\"unique_idx\").on(countries.name), // unique index\n  })\n);\n\nexport const cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\", { length: 256 }),\n  countryId: integer(\"country_id\").references(() => countries.id), // inline foreign key\n  countryName: text(\"country_id\"),\n}, (cities) => ({\n  // explicit foreign key with 1 column\n  countryFk: foreignKey(() => ({\n    columns: [cities.countryId],\n    foreignColumns: [countries.id],\n  })),\n  // explicit foreign key with multiple columns\n  countryIdNameFk: foreignKey(() => ({\n    columns: [cities.countryId, cities.countryName],\n    foreignColumns: [countries.id, countries.name],\n  })),\n}));\n\nconst pkExample = sqliteTable('pk_example', {\n  id: integer('id'),\n  name: text('name').notNull(),\n  email: text('email').notNull(),\n}, (pkExample) => ({\n  // composite primary key on multiple columns\n  compositePk: primaryKey(pkExample.id, pkExample.name)\n}));\n\n// you can have .where() on indexes\nindex(\"name_idx\").on(table.column).where(sql``)\n```\n\n### Create Read Update Delete\n\nQuerying, sorting and filtering. We also support partial select.\n\n```typescript\n...\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { and, asc, desc, eq, or } from \"drizzle-orm/expressions\"\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"full_name\"),\n});\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\ndb.select(users).all();\ndb.select(users).where(eq(users.id, 42)).get();\n\n// you can combine filters with and(...) or or(...)\ndb.select(users).where(and(eq(users.id, 42), eq(users.name, \"Dan\"))).all();\n\ndb.select(users).where(or(eq(users.id, 42), eq(users.id, 1))).all();\n\n// partial select\nconst result = db.select(users).fields({\n    field1: users.id,\n    field2: users.name,\n  }).all();\nconst { field1, field2 } = result[0];\n\n// limit offset & order by\ndb.select(users).limit(10).offset(10).all();\ndb.select(users).orderBy(asc(users.name)).all();\ndb.select(users).orderBy(desc(users.name)).all();\n// you can pass multiple order args\ndb.select(users).orderBy(asc(users.name), desc(users.name)).all();\n\n// list of all filter operators\neq(column, value)\neq(column1, column2)\nne(column, value)\nne(column1, column2)\n\nnotEq(column, value)\nless(column, value)\nlessEq(column, value)\n\ngt(column, value)\ngt(column1, column2)\ngte(column, value)\ngte(column1, column2)\nlt(column, value)\nlt(column1, column2)\nlte(column, value)\nlte(column1, column2)\n\nisNull(column)\nisNotNull(column)\n\ninArray(column, values[])\ninArray(column, sqlSubquery)\nnotInArray(column, values[])\nnotInArray(column, sqlSubquery)\n\nexists(sqlSubquery)\nnotExists(sqlSubquery)\n\nbetween(column, min, max)\nnotBetween(column, min, max)\n\nlike(column, value)\nlike(column, value)\nilike(column, value)\nnotIlike(column, value)\n\nnot(sqlExpression)\n\nand(exressions: Expr[])\nor(exressions: Expr[])\n```\n\nInserting\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  createdAt: integer(\"created_at\", { mode: \"timestamp\" }),\n});\n\ndb.insert(users).values({ name: \"Andrew\", createdAt: +new Date() }).run();\n\n// insert multiple users\ndb.insert(users).values({\n      name: \"Andrew\",\n      createdAt: +new Date(),\n    },{\n      name: \"Dan\",\n      createdAt: +new Date(),\n    }).run();\n\n// insert with returning\nconst insertedUser = db.insert(users).values({ name: \"Dan\", createdAt: +new Date() }).returning().get()\n```\n\nUpdate and Delete\n\n```typescript\ndb.update(users)\n  .set({ name: 'Mr. Dan' })\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n  \ndb.delete(users)\n  .where(eq(usersTable.name, 'Dan'))\n  .run();\n```\n\n### Aggregations\n\nThey work just like they do in SQL, but you have them fully type safe\n\n```typescript\nconst orders = sqliteTable(\"order\", {\n  id: integer(\"id\").primaryKey(),\n  orderDate: integer(\"order_date\", { mode: \"timestamp\" }).notNull(),\n  requiredDate: integer(\"required_date\", { mode: \"timestamp\" }).notNull(),\n  shippedDate: integer(\"shipped_date\", { mode: \"timestamp\" }),\n  shipVia: integer(\"ship_via\").notNull(),\n  freight: numeric(\"freight\").notNull(),\n  shipName: text(\"ship_name\").notNull(),\n  shipCity: text(\"ship_city\").notNull(),\n  shipRegion: text(\"ship_region\"),\n  shipPostalCode: text(\"ship_postal_code\"),\n  shipCountry: text(\"ship_country\").notNull(),\n  customerId: text(\"customer_id\").notNull(),\n  employeeId: integer(\"employee_id\").notNull(),\n});\n\nconst details = sqliteTable(\"order_detail\", {\n  unitPrice: numeric(\"unit_price\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n  discount: numeric(\"discount\").notNull(),\n  orderId: integer(\"order_id\").notNull(),\n  productId: integer(\"product_id\").notNull(),\n});\n\n\ndb.select(orders).fields({\n    id: orders.id,\n    shippedDate: orders.shippedDate,\n    shipName: orders.shipName,\n    shipCity: orders.shipCity,\n    shipCountry: orders.shipCountry,\n    productsCount: sql`count(${details.productId})`.as<number>(),\n    quantitySum: sql`sum(${details.quantity})`.as<number>(),\n    totalPrice: sql`sum(${details.quantity} * ${details.unitPrice})`.as<number>(),\n  })\n  .leftJoin(details, eq(orders.id, details.orderId))\n  .groupBy(orders.id)\n  .orderBy(asc(orders.id))\n  .all();\n```\n\n### Joins\n\nLast but not least. Probably the most powerful feature in the library🚀\n\n### Many-to-one\n\n```typescript\nimport { sqliteTable, text, integer } from \"drizzle-orm-sqlite\";\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\n\nconst cities = sqliteTable(\"cities\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n  cityId: integer(\"city_id\").references(() => cities.id)\n});\n\nconst db = drizzle(sqlite);\n\nconst result = db.select(cities).leftJoin(users, eq(cities2.id, users2.cityId)).all()\n```\n\n### Many-to-many\n\n```typescript\nconst users = sqliteTable(\"users\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst chatGroups = sqliteTable(\"chat_groups\", {\n  id: integer(\"id\").primaryKey(),\n  name: text(\"name\"),\n});\n\nconst usersToChatGroups = sqliteTable(\"usersToChatGroups\", {\n  userId: integer(\"user_id\").notNull().references(() => users.id),\n  groupId: integer(\"group_id\").notNull().references(() => chatGroups.id),\n});\n\n...\nconst db = drizzle(...);\n\n// querying user group with id 1 and all the participants(users)\ndb.select(usersToChatGroups)\n  .leftJoin(users, eq(usersToChatGroups.userId, users.id))\n  .leftJoin(chatGroups, eq(usersToChatGroups.groupId, chatGroups.id))\n  .where(eq(chatGroups.id, 1))\n  .all();\n```\n\n### Join aliases and selfjoins\n\n```typescript\nimport { ..., alias } from \"drizzle-orm-sqlite\";\n\nexport const files = sqliteTable(\"folders\", {\n  name: text(\"name\").notNull(),\n  parent: text(\"parent_folder\")\n})\n\n...\nconst db = drizzle(...);\n\nconst nestedFiles = alias(files, \"nested_files\");\ndb.select(files)\n  .leftJoin(nestedFiles, eq(files.name, nestedFiles.name))\n  .where(eq(files.parent, \"/\"))\n  .all();\n// will return files and folers and nested files for each folder at root dir\n```\n\n### Join using partial field select\n\nJoin Cities with Users getting only needed fields form request\n\n```typescript\ndb.select(cities).fields({\n  id: cities.id,\n  cityName: cities.name\n  userId: users.id\n}).leftJoin(users, eq(users.cityId, cities.id))\n  .all();\n```\n\n## ⚡️ Performance and prepared statements\n\nWith Drizzle ORM you can go [**faster than better-sqlite3 driver**](https://twitter.com/_alexblokh/status/1593593415907909634) by utilizing our `prepared statements` and `placeholder` APIs\n\n```typescript\nimport { placeholder } from \"drizzle-orm/sql\";\n\nconst db = drizzle(...);\n\nconst q = db.select(customers).prepare();\nq.all() // SELECT * FROM customers\n\nconst q = db.select(customers).where(eq(customers.id, placeholder(\"id\"))).prepare()\n\nq.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10\nq.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12\n\nconst q = db.select(customers)\n  .where(sql`lower(${customers.name}) like ${placeholder(\"name\")}`)\n  .prepare();\n\nq.all({ name: \"%an%\" }) // SELECT * FROM customers WHERE name ilike '%an%'\n```\n\n## 🗄 Migrations\n\n### Automatic SQL migrations generation with drizzle-kit\n\n[DrizzleKit](https://www.npmjs.com/package/drizzle-kit) - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like delitions and renames by prompting user input.\\\nCheck out the [docs for DrizzleKit](https://github.com/drizzle-team/drizzle-kit-mirror)\n\nFor schema file:\n\n```typescript\nimport { index, integer, sqliteTable, text } from \"drizzle-orm-sqlite\";\n\nexport const users = sqliteTable(\"users\", {\n  id: serial(\"id\").primaryKey(),\n  fullName: text(\"full_name\"),\n}, (users) => ({\n  nameIdx: index(\"name_idx\", users.fullName),\n}));\n\nexport const authOtps = sqliteTable(\"auth_otp\", {\n  id: integer(\"id\").primaryKey(),\n  phone: text(\"phone\"),\n  userId: integer(\"user_id\").references(() => users.id),\n}\n```\n\nIt will generate:\n\n```SQL\nCREATE TABLE IF NOT EXISTS auth_otp (\n  \"id\" INTEGER PRIMARY KEY,\n  \"phone\" TEXT,\n  \"user_id\" INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS users (\n  \"id\" INTEGER PRIMARY KEY,\n  \"full_name\" TEXT\n);\n\nDO $$ BEGIN\n ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY (\"user_id\") REFERENCES users(id);\nEXCEPTION\n WHEN duplicate_object THEN null;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);\n```\n\nAnd you can run migrations manually or using our embedded migrations module\n\n```typescript\nimport { drizzle } from 'drizzle-orm-sqlite/better-sqlite3';\nimport { migrate } from 'drizzle-orm-sqlite/better-sqlite3/migrator';\nimport Database from \"better-sqlite3\";\n\nconst sqlite = new Database(\"sqlite.db\");\nconst db = drizzle(sqlite);\n\n// this will automatically run needed migrations on the database\nmigrate(db, { migrationsFolder: \"./drizzle\" })\n```\n\n## Utility stuff\n\n### Printing SQL query\n\n```typescript\nconst query = db.select(users)\n    .fields({ id: users.id, name: users.name })\n    .groupBy(users.id)\n    .toSQL();\n// query:\n{\n  sql: 'select \"id\", \"name\" from \"users\" group by \"users\".\"id\"',\n  params: [],\n}\n```\n\n### Raw query usage\n\n```typescript\n// it will automatically run a parametrized query!\nconst res: QueryResult<any> = await db.run(sql`SELECT * FROM users WHERE user.id = ${userId}`)\n```\n","readmeFilename":"README.md","_id":"drizzle-orm-sqlite@0.16.1-78fb61e","_integrity":"sha512-U5I8CjN1MfU4Y28g78SLj1XdYYV+SkBxAqtwgQY1kILf5bsypQGDnklkz+2SPZ/6p/yjSQrzIv4A3HF2hbOx2Q==","_resolved":"/home/runner/work/drizzle-orm/drizzle-orm/drizzle-orm-sqlite/package.tgz","_from":"file:package.tgz","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-U5I8CjN1MfU4Y28g78SLj1XdYYV+SkBxAqtwgQY1kILf5bsypQGDnklkz+2SPZ/6p/yjSQrzIv4A3HF2hbOx2Q==","shasum":"778b28adc4261177ad77f5d23984a7964defc129","tarball":"https://registry.npmjs.org/drizzle-orm-sqlite/-/drizzle-orm-sqlite-0.16.1-78fb61e.tgz","fileCount":174,"unpackedSize":251058,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeFPFo1vdydEz9HxvZ0K+ukn7Ea1WaAq4i2hj1wOShYgIhAKXO3h6c4643jeZaA4K39elHpkEWR977Xw3nGTknkSKB"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj0ZhcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjvRAAmd32eb8wz5QgLNtJQUXuvC8ZKXDGWnua62Q6/1BLPUQqVmg9\r\nP6cDak/cOaeUclsNuJ+e8c4riL8MDDUvWmMOQFF0CL2n+mAU2mTs38Fsy957\r\nB6/NHIFWFpvKMVb+lu1g/D3XK40EjrA7D2IdpZGT5tE2c701oCJd2J3BxgOK\r\nXhI+e7WXaOSID/awjppNCS186mfuO6hrq7Kh99688NVnOJEX6nmCqiQ6qGQ6\r\nHOXclBlg0eHE+Z0vEKppGdcC0et6vfRwwb60bIIcMp5I0O0bGBucKpNSVWM1\r\n5wAom04wqC+ONhGTzm1hO7AhC2nLNCtdVuumEAbqYdSYaDuafyqqP+PFEcP9\r\nIaPRYUoKQQ49OJxjprq3uew6glJh+lYVhiDRJZFy+Z1ciCxULMpwphQN7o+k\r\noT6d71+w3kowNyIk1wD2o6HlQ9B6t8B57NpDQB06jG6+4fsTfrtGrUO31qjE\r\nYtzrSZOU9FaZfiHL4VHtxj+EuTLahO282H4iPgbdvrnPhN63dnX0BM24iMSx\r\nz8qv2ttUIigsUVZmR15NxoKWt7sQoiyoS05zPDIYRho9x6nnWZ8dvB6JLy2c\r\n57sXuCU7JpMB0V6AadC14HeclIMfulw+x5EFlT4Nnv/3pG79y+grf/pgWvCX\r\nfbdI6Rk+wtUBofhkNoUXt6iLCohTuagehKA=\r\n=VQIG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"dankochetov","email":"danil.kochetov@gmail.com"},"directories":{},"maintainers":[{"name":"alexblokh","email":"aleksandrblokh@gmail.com"},{"name":"sheriman","email":"andreysherman11@gmail.com"},{"name":"dankochetov","email":"danil.kochetov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/drizzle-orm-sqlite_0.16.1-78fb61e_1674680411952_0.058725560509702124"},"_hasShrinkwrap":false,"deprecated":"This package is merged into drizzle-orm starting from 0.17.0. See https://www.npmjs.com/package/drizzle-orm"}},"time":{"created":"2022-10-31T16:46:09.507Z","0.12.0-beta.1":"2022-10-31T16:46:09.763Z","modified":"2024-05-24T19:50:47.220Z","0.12.0-beta.2":"2022-11-01T20:28:06.795Z","0.12.0-beta.3":"2022-11-02T12:02:47.497Z","0.12.0-beta.4":"2022-11-03T12:13:44.729Z","0.12.0-beta.5":"2022-11-03T14:49:27.584Z","0.12.0-beta.6":"2022-11-03T15:06:15.308Z","0.12.0-beta.7":"2022-11-03T15:22:30.856Z","0.12.0-beta.8":"2022-11-04T09:17:52.878Z","0.12.0-beta.9":"2022-11-07T11:56:32.999Z","0.12.0-beta.10":"2022-11-07T15:23:43.225Z","0.12.0-beta.11":"2022-11-08T09:12:37.979Z","0.12.0-beta.12":"2022-11-14T10:23:18.679Z","0.12.0-beta.13":"2022-11-16T15:17:20.954Z","0.12.0-beta.14":"2022-11-21T13:55:06.651Z","0.12.0-beta.15":"2022-11-21T15:05:51.922Z","0.12.0-beta.16":"2022-11-23T12:11:53.806Z","0.12.0-beta.17":"2022-12-02T13:50:20.552Z","0.12.0-beta.18":"2022-12-06T12:56:46.404Z","0.12.0-beta.19":"2022-12-07T18:15:03.456Z","0.12.0-beta.20":"2022-12-07T18:55:47.005Z","0.12.0-beta.21":"2022-12-08T15:48:23.426Z","0.13.0":"2022-12-08T16:34:02.261Z","0.13.0-6924c130cdaa28e770d96cb4300615910eaa3da6":"2022-12-12T15:12:15.759Z","0.13.0-7d422f2":"2022-12-12T15:24:32.267Z","0.13.0-a61a883":"2022-12-12T15:50:20.705Z","0.13.0-6a923f2":"2022-12-12T15:53:32.512Z","0.13.0-a7bfec3":"2022-12-12T17:37:22.259Z","0.13.0-cd3f5e4":"2022-12-13T10:26:08.669Z","0.14.0":"2022-12-13T10:35:40.456Z","0.14.0-beta.1-44e9f79":"2022-12-13T10:48:21.686Z","0.14.0-beta.1":"2022-12-13T10:48:42.103Z","0.14.0-beta.2-f67992c":"2022-12-13T12:25:01.624Z","0.14.0-beta.2":"2022-12-13T12:26:09.767Z","0.14.0-beta.2-a4036d1":"2022-12-13T15:38:29.144Z","0.14.0-beta.2-29bad0a":"2022-12-13T15:40:38.848Z","0.14.0-beta.2-97a60e2":"2022-12-13T15:44:54.265Z","0.14.0-beta.2-a35bf74":"2022-12-13T15:48:42.674Z","0.14.0-beta.2-502278b":"2022-12-14T12:07:54.638Z","0.13.0-efa4dda":"2022-12-15T11:46:10.786Z","0.13.0-f115120":"2022-12-15T11:50:40.855Z","0.13.0-03f651b":"2022-12-15T11:58:58.487Z","0.14.1":"2022-12-15T14:07:19.948Z","0.14.1-bad61c5":"2022-12-15T14:53:27.526Z","0.14.1-f92529c":"2022-12-15T14:56:25.743Z","0.14.1-7d1d823":"2022-12-15T15:02:06.634Z","0.14.1-1f44b00":"2022-12-15T22:30:42.325Z","0.14.1-1c58471":"2022-12-15T22:32:22.359Z","0.14.1-1d98f11":"2022-12-15T22:34:05.024Z","0.14.1-f617bb6":"2022-12-16T10:46:02.151Z","0.14.1-c5dca58":"2022-12-16T11:00:31.347Z","0.14.2-3793d78":"2022-12-16T11:16:38.733Z","0.14.2":"2022-12-16T11:19:02.382Z","0.14.2-3967f06":"2022-12-16T11:22:01.105Z","0.14.2-e902ba8":"2022-12-16T13:26:54.193Z","0.13.0-9f4af29":"2022-12-19T17:22:12.024Z","0.14.2-5514014":"2022-12-19T17:45:32.421Z","0.14.2-cc06fec":"2022-12-19T17:45:59.718Z","0.14.2-c7344a5":"2022-12-19T17:46:55.727Z","0.14.2-01c3d82":"2022-12-20T18:19:04.214Z","0.14.2-4eada6d":"2022-12-21T17:51:08.696Z","0.14.2-1e42665":"2022-12-21T18:00:17.843Z","0.14.2-c153bbf":"2022-12-21T18:08:00.538Z","0.14.2-e295848":"2022-12-21T18:08:03.624Z","0.14.2-6f226c1":"2022-12-21T18:10:41.517Z","0.14.2-f8d0d46":"2022-12-21T18:11:53.447Z","0.14.2-cce4cab":"2022-12-21T18:15:34.299Z","0.14.2-314c1fa":"2022-12-21T18:48:35.400Z","0.13.0-b8ae68d":"2022-12-22T15:08:55.995Z","0.13.0-099a94f":"2022-12-22T15:11:05.725Z","0.13.0-a486088":"2022-12-22T20:19:37.014Z","0.13.0-d68193c":"2022-12-22T20:26:29.209Z","0.13.0-671a09e":"2022-12-22T20:37:38.663Z","0.14.2-5b14ef4":"2022-12-22T21:02:07.631Z","0.14.3-9ba6169":"2022-12-29T11:32:57.700Z","0.14.3":"2022-12-29T11:40:04.526Z","0.14.3-5ce7d69":"2023-01-02T18:45:58.525Z","0.14.3-4e3a5b9":"2023-01-05T11:32:50.514Z","0.14.3-dd27c86":"2023-01-05T15:25:52.079Z","0.14.3-67805d4":"2023-01-05T15:34:13.331Z","0.14.4-1bcee50":"2023-01-05T19:36:22.297Z","0.14.4":"2023-01-05T19:38:08.142Z","0.15.0-07f606f":"2023-01-06T14:31:20.897Z","0.15.0-a90d3bc":"2023-01-06T19:03:29.884Z","0.15.0-7d17618":"2023-01-08T14:32:22.789Z","0.14.5-59f0a3a":"2023-01-09T14:32:41.045Z","0.14.5":"2023-01-09T14:36:19.479Z","0.15.0-2e1e5b2":"2023-01-10T11:26:14.218Z","0.15.0-60954a3":"2023-01-10T13:56:04.836Z","0.15.0":"2023-01-10T14:06:28.640Z","0.15.0-88523f9":"2023-01-12T13:56:17.796Z","0.15.0-f67dd9d":"2023-01-12T14:44:25.262Z","0.15.0-80901ff":"2023-01-12T14:47:31.891Z","0.15.0-4a5b2e3":"2023-01-12T15:58:56.241Z","0.15.0-9728cc6":"2023-01-12T16:35:29.948Z","0.15.0-19c5c02":"2023-01-12T16:48:37.019Z","0.15.0-3548c99":"2023-01-12T17:14:50.735Z","0.15.0-a1b76f5":"2023-01-13T10:34:56.399Z","0.15.0-656bcc3":"2023-01-13T14:24:00.779Z","0.15.0-6879c1d":"2023-01-14T10:53:58.381Z","0.15.0-1766537":"2023-01-14T11:29:25.890Z","0.15.0-2b4d90d":"2023-01-14T11:49:29.434Z","0.15.2":"2023-01-16T14:07:42.748Z","0.15.2-52e75f5":"2023-01-16T14:40:42.902Z","0.15.3-c675dde":"2023-01-16T14:56:44.226Z","0.15.3":"2023-01-16T15:01:41.413Z","0.15.3-1e62a3e":"2023-01-16T16:08:23.045Z","0.15.3-72fb2c0":"2023-01-16T16:43:22.154Z","0.15.3-23baedd":"2023-01-16T18:05:21.731Z","0.15.3-844cb31":"2023-01-16T18:48:27.118Z","0.15.3-98b2097":"2023-01-16T20:00:43.695Z","0.15.3-0dcbb16":"2023-01-16T20:01:44.017Z","0.15.3-335d188":"2023-01-17T19:34:26.629Z","0.15.4-b422bc1":"2023-01-18T15:52:01.734Z","0.15.4-b3dd40c":"2023-01-18T16:04:11.721Z","0.15.4":"2023-01-18T16:14:03.369Z","0.15.4-71be15e":"2023-01-18T16:20:06.630Z","0.15.4-30915c1":"2023-01-18T16:20:56.862Z","0.15.4-36368e7":"2023-01-19T08:15:10.584Z","0.15.3-adba448":"2023-01-19T09:14:19.747Z","0.15.3-bbe577c":"2023-01-19T10:12:51.971Z","0.15.3-1c43305":"2023-01-19T10:58:30.697Z","0.15.4-f77c6c2":"2023-01-19T11:02:01.702Z","0.15.4-1f6c448":"2023-01-19T11:04:29.731Z","0.15.4-d8f67aa":"2023-01-19T11:08:36.991Z","0.16.0-11f7ff3":"2023-01-19T16:32:05.711Z","0.16.0-3e17d6e":"2023-01-19T19:42:08.976Z","0.16.0":"2023-01-19T19:51:17.090Z","0.16.0-56d16f9":"2023-01-19T20:31:32.110Z","0.16.0-b4b5a09":"2023-01-19T20:40:23.184Z","0.16.0-ddf4681":"2023-01-19T20:50:26.371Z","0.16.0-484a8ae":"2023-01-20T07:52:31.502Z","0.16.0-af45b90":"2023-01-20T13:20:47.729Z","0.16.0-b9e9ba0":"2023-01-20T13:39:56.576Z","0.16.0-4124cf0":"2023-01-20T13:48:46.946Z","0.16.0-51c77ba":"2023-01-20T13:50:57.700Z","0.16.0-cf5a510":"2023-01-20T14:47:41.804Z","0.16.0-c522f26":"2023-01-20T15:03:07.881Z","0.16.0-97f9977":"2023-01-21T11:16:42.582Z","0.16.1-43776eb":"2023-01-22T13:31:37.919Z","0.16.0-2c4c5b1":"2023-01-24T07:10:45.249Z","0.16.1-60d4ce6":"2023-01-24T07:19:15.371Z","0.16.1":"2023-01-24T07:37:35.986Z","0.16.1-78fb61e":"2023-01-25T21:00:12.234Z"},"maintainers":[{"email":"kyrylo.usichenko@gmail.com","name":"kyrylo_usichenko"},{"email":"aleksandrblokh@gmail.com","name":"alexblokh"},{"email":"andreysherman11@gmail.com","name":"sheriman"},{"email":"danil.kochetov@gmail.com","name":"dankochetov"}],"description":"Drizzle ORM package for SQLite database","homepage":"https://github.com/drizzle-team/drizzle-orm#readme","keywords":["orm","sqlite","database","sql","typescript"],"repository":{"type":"git","url":"git+https://github.com/drizzle-team/drizzle-orm.git"},"bugs":{"url":"https://github.com/drizzle-team/drizzle-orm/issues"},"license":"Apache-2.0","readme":"","readmeFilename":"","author":{"name":"Drizzle Team"}}